ano-ui
Version:
<p align="center"> <img src="https://github.com/ano-ui/ano-ui/raw/main/public/logo.svg" style="width:100px;" /> <h1 align="center">Ano-UI (WIP)</h1> <p align="center">An UniApp UI components with UnoCSS.</p> </p> <p align="center"> <a href="https://www.np
1,389 lines (1,331 loc) • 36.9 kB
JavaScript
;
const preset = require('@ano-ui/preset');
const vue = require('vue');
const UPDATE_MODEL_EVENT = "update:modelValue";
const UPDATE_SHOW_EVENT = "update:show";
const CHANGE_EVENT = "change";
const INPUT_EVENT = "input";
const CLICK_EVENT = "click";
const OPEN_EVENT = "open";
const CLOSE_EVENT = "close";
const OPENED_EVENT = "opened";
const CLOSED_EVENT = "closed";
const FOCUS_EVENT = "focus";
const BLUR_EVENT = "blur";
const CONFIRM_EVENT = "confirm";
const CLEAR_EVENT = "clear";
const CANCEL_EVENT = "cancel";
const useCustomClassProp = {
type: [String, Object, Array],
default: ""
};
const useCustomStyleProp = {
type: [String, Object, Array],
default: ""
};
const useVariantProp = {
type: String,
default: "solid"
};
const sizeList = ["mini", "small", "normal", "large"];
const useSizeProp = {
type: String,
validator: (value) => sizeList.includes(value),
default: "normal"
};
const typeList = ["default", "primary", "success", "info", "warning", "danger"];
const useTypeProp = {
type: String,
validator: (value) => typeList.includes(value),
default: "default"
};
const directionList = ["vertical", "horizontal"];
const useDirectionProp = {
type: String,
validator: (value) => directionList.includes(value),
default: "vertical"
};
const positionList = ["top", "bottom", "left", "right", "center"];
const PositionProp = {
type: String,
validator: (value) => positionList.includes(value),
default: "center"
};
const toString = Object.prototype.toString;
function is(val, type) {
return toString.call(val) === `[object ${type}]`;
}
function isDef(val) {
return typeof val !== "undefined";
}
function isUnDef(val) {
return !isDef(val);
}
function isObject(val) {
return val !== null && is(val, "Object");
}
function isEmpty(val) {
if (isArray(val) || isString(val))
return val.length === 0;
if (val instanceof Map || val instanceof Set)
return val.size === 0;
if (isObject(val))
return Object.keys(val).length === 0;
return false;
}
function isDate(val) {
return is(val, "Date");
}
function isNull(val) {
return val === null;
}
function isNullAndUnDef(val) {
return isUnDef(val) && isNull(val);
}
function isNullOrUnDef(val) {
return isUnDef(val) || isNull(val);
}
function isNumber(val) {
return is(val, "Number");
}
function isPromise(val) {
return is(val, "Promise") && isObject(val) && isFunction(val.then) && isFunction(val.catch);
}
function isString(val) {
return is(val, "String");
}
function isFunction(val) {
return typeof val === "function";
}
function isBoolean(val) {
return is(val, "Boolean");
}
function isRegExp(val) {
return is(val, "RegExp");
}
function isArray(val) {
return val && Array.isArray(val);
}
function isWindow(val) {
return typeof window !== "undefined" && is(val, "Window");
}
function isElement(val) {
return isObject(val) && !!val.tagName;
}
function isMap(val) {
return is(val, "Map");
}
function isUrl(path) {
const reg = /^http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w- .\/?%&=]*)?/;
return reg.test(path);
}
const unknownProp = null;
const numericProp = [Number, String];
const truthProp = {
type: Boolean,
default: true
};
function makeRequiredProp(type) {
return {
type,
required: true
};
}
function makeArrayProp(defaultVal = []) {
return {
type: Array,
default: () => defaultVal
};
}
function makeNumberProp(defaultVal) {
return {
type: Number,
default: defaultVal
};
}
function makeNumericProp(defaultVal) {
return {
type: numericProp,
default: defaultVal
};
}
function makeStringProp(defaultVal) {
return {
type: String,
default: defaultVal
};
}
function createDeferred() {
let resolve = noop;
let reject = noop;
const promise = new Promise((_resolve, _reject) => {
resolve = _resolve;
reject = _reject;
});
promise.resolve = resolve;
promise.reject = reject;
return promise;
}
function toArray(value) {
if (!value)
return [];
return Array.isArray(value) ? value : [value];
}
function guid() {
const s4 = () => Math.floor((1 + Math.random()) * 65536).toString(16).slice(1);
return `${s4() + s4()}`;
}
function delay(ms) {
const promise = createDeferred();
setTimeout(promise.resolve, ms);
return promise;
}
function noop() {
}
function createQuerySelector(type, mode = "select") {
const ready = createDeferred();
const instance = vue.getCurrentInstance();
function query(selector, fields = {}) {
const promise = createDeferred();
function resolve(value) {
const result = toArray(value);
const resolved = mode === "select" ? result[0] : result;
result.length ? promise.resolve(resolved) : promise.reject();
}
ready.then(() => {
const query2 = uni.createSelectorQuery().in(instance)[mode](selector);
if (type === "fields")
query2.fields(fields, resolve).exec();
else
query2[type](resolve).exec();
});
return promise;
}
vue.onMounted(ready.resolve);
return query;
}
function useQuerySelector(...args) {
return createQuerySelector(args[0], "select");
}
function useQuerySelectorAll(...args) {
return createQuerySelector(args[0], "selectAll");
}
const avatarGroupProps = {
customClass: useCustomClassProp,
customStyle: useCustomStyleProp,
max: Number,
options: makeArrayProp()
};
const avatarGroupEmits = {
[CLICK_EVENT]: (evt) => evt instanceof Object
};
function useAvatarGroup(props, emit) {
const className = vue.computed(() => []);
const clickHandler = (evt) => {
emit(CLICK_EVENT, evt);
};
const spliceOptions = vue.computed(() => {
const options = props.options || [];
return props.max ? options.slice(0, props.max - 1) : options;
});
const reset = vue.computed(() => {
const length = (props.options || []).length;
return length - (props.max || 0) + 1;
});
const lt = vue.computed(() => {
const length = (props.options || []).length;
return length > (props.max || 0);
});
return {
className,
spliceOptions,
reset,
lt,
clickHandler
};
}
const useAvatarSizeProp = useSizeProp;
const avatarProps = {
customClass: useCustomClassProp,
customStyle: useCustomStyleProp,
size: useAvatarSizeProp,
src: String,
fit: makeStringProp("cover")
};
const avatarEmits = {
[CLICK_EVENT]: (evt) => evt instanceof Object
};
const sizeClasses = {
mini: "w-8",
small: "w-10",
normal: "w-12",
large: "w-14"
};
function useAvatar(props, emit) {
const classes = vue.computed(() => {
const sizeClass = sizeClasses[props.size];
return sizeClass ? [sizeClass] : [];
});
function clickHandler(evt) {
emit(CLICK_EVENT, evt);
}
const mode = vue.computed(() => {
const modes = {
fill: "aspectFit",
cover: "aspectFill",
contain: "scaleToFill"
};
return modes[props.fit];
});
return {
classes,
clickHandler,
mode
};
}
const useButtonTypeProp = useTypeProp;
const useButtonSizeProp = useSizeProp;
const buttonProps = {
customClass: useCustomClassProp,
customStyle: useCustomStyleProp,
type: useButtonTypeProp,
size: useButtonSizeProp,
variant: useVariantProp,
disabled: Boolean,
icon: String,
openType: String,
block: Boolean,
loading: Boolean
};
const buttonEmits = {
[CLICK_EVENT]: (evt) => evt instanceof Object
};
function useButton(props, emit) {
const disabled = vue.computed(() => props.disabled || props.loading);
function clickHandler(evt) {
if (disabled.value)
return;
emit(CLICK_EVENT, evt);
}
const classes = vue.computed(() => [
`a-${props.type}`,
props.type === "default" && "a-type-default",
`a-button-${props.size}`,
`a-${props.variant}`,
props.block ? "w-full flex" : "inline-flex",
disabled.value ? "op-50" : ""
]);
return {
disabled,
classes,
clickHandler
};
}
const cellProps = {
customClass: useCustomClassProp,
customStyle: useCustomStyleProp,
title: String,
value: String,
label: String,
icon: String,
arrow: {
type: [Boolean, String]
},
center: Boolean,
clickable: Boolean,
disabled: Boolean,
titleClass: useCustomClassProp,
titleStyle: useCustomStyleProp,
valueClass: useCustomClassProp,
valueStyle: useCustomStyleProp,
labelClass: useCustomClassProp,
labelStyle: useCustomStyleProp
};
const cellEmits = {
[CLICK_EVENT]: (evt) => evt instanceof Object
};
const checkboxGroupKey = Symbol("checkboxGroupKey");
const radioGroupKey = Symbol("radioGroupKey");
const cellGroupKey = Symbol("cellGroupKey");
const collapseContextKey = Symbol("collapseContextKey");
function useCell(props, emit) {
const cellGroup = vue.inject(cellGroupKey, void 0);
const arrow = vue.computed(() => cellGroup?.arrow || props.arrow);
const clickable = vue.computed(() => cellGroup?.clickable || props.clickable);
const classes = vue.computed(() => {
const _classes = [];
if (arrow.value || clickable.value)
_classes.push("a-active-h5");
return _classes;
});
function clickHandler(evt) {
emit(CLICK_EVENT, evt);
}
return {
arrow,
clickable,
classes,
clickHandler
};
}
const popupProps = {
customClass: useCustomClassProp,
customStyle: useCustomStyleProp,
show: Boolean,
position: PositionProp,
duration: makeNumberProp(200)
};
const popupEmits = {
[UPDATE_SHOW_EVENT]: (value) => isBoolean(value),
[OPEN_EVENT]: () => true,
[CLOSE_EVENT]: () => true,
[OPENED_EVENT]: () => true,
[CLOSED_EVENT]: () => true
};
function usePopup(props, emit) {
const show = vue.ref(props.show || false);
const showValue = vue.computed({
get: () => props.show || show.value,
set(val) {
if (val)
emit(OPEN_EVENT);
else
emit(CLOSE_EVENT);
show.value = val;
emit(UPDATE_SHOW_EVENT, val);
}
});
const classes = vue.computed(() => {
const { position } = props;
return [
position === "center" && "left-50% top-50% translate--50%",
position === "top" && "top-0 left-0 right-0",
position === "bottom" && "bottom-0 left-0 right-0",
position === "left" && "left-0 top-0 bottom-0",
position === "right" && "right-0 top-0 bottom-0"
];
});
return {
showValue,
classes
};
}
const toastProps = {
customClass: useCustomClassProp,
customStyle: useCustomStyleProp
};
const toastEmits = {
[CLOSE_EVENT]: () => true
};
function useToast(props, emit) {
let timer;
const visible = vue.ref(false);
const state = vue.ref();
function close() {
clearTimeout(timer);
visible.value = false;
emit(CLOSE_EVENT);
}
function show(options = {}) {
const {
position = "default",
message = "",
duration = 2e3,
type
} = options;
visible.value = true;
state.value = {
type,
position,
message,
duration
};
clearTimeout(timer);
if (state.value.duration !== false)
timer = setTimeout(close, state.value.duration);
}
const classes = vue.computed(() => {
return [
state.value?.position === "default" && "left-50% top-50% translate--50%",
state.value?.position === "top" && "left-50% top-20% translate--50%",
state.value?.position === "bottom" && "left-50% top-80% translate--50%"
];
});
return {
state,
show,
close,
visible,
classes
};
}
const useCheckboxTypeProp = useTypeProp;
const useCheckboxSizeProp = useSizeProp;
const checkboxProps = {
customClass: useCustomClassProp,
customStyle: useCustomStyleProp,
type: useCheckboxTypeProp,
size: useCheckboxSizeProp,
variant: useVariantProp,
disabled: Boolean,
modelValue: {
type: [Number, String, Boolean],
default: void 0
},
value: {
type: [String, Number, Boolean],
default: ""
},
label: String,
icon: String,
customIcon: Boolean,
labelDisabled: Boolean
};
const checkboxEmits = {
[UPDATE_MODEL_EVENT]: (val) => isString(val) || isNumber(val) || isBoolean(val),
[CHANGE_EVENT]: (val) => isString(val) || isNumber(val) || isBoolean(val)
};
function useCheckbox(props, emit) {
const checkboxGroup = vue.inject(checkboxGroupKey, void 0);
const isGroup = vue.computed(() => !!checkboxGroup);
const size = vue.computed(() => checkboxGroup?.size ?? props.size);
const min = vue.computed(() => checkboxGroup?.min);
const max = vue.computed(() => checkboxGroup?.max);
const modelValue = vue.computed(() => isGroup.value ? checkboxGroup.modelValue : props.modelValue);
const disabled = vue.computed(() => {
if (!isGroup.value)
return props.disabled;
const { disabled: disabled2, min: min2, max: max2 } = checkboxGroup;
if (disabled2)
return true;
if (isGroup.value && isArray(modelValue.value)) {
if (min2 !== -1 && modelValue.value.length === min2)
return modelValue.value.includes(props.value);
if (max2 !== -1 && modelValue.value.length === max2)
return !modelValue.value.includes(props.value);
}
return false;
});
const labelDisabled = vue.computed(() => props.labelDisabled || (checkboxGroup?.labelDisabled ?? false));
const checked = vue.computed(() => {
if (isGroup.value) {
const value = checkboxGroup.modelValue;
return Array.isArray(value) ? value.includes(props.value) : value === props.value;
} else {
return props.modelValue;
}
});
const toggle = (e) => {
e.stopPropagation();
if (isGroup.value && isArray(modelValue.value)) {
const newValue = [...modelValue.value];
newValue.includes(props.value) ? newValue.splice(newValue.indexOf(props.value), 1) : newValue.push(props.value);
checkboxGroup.changeEvent(newValue);
} else {
emit && emit(UPDATE_MODEL_EVENT, !props.modelValue);
}
emit && emit(CHANGE_EVENT, !props.modelValue);
};
const iconClickHandler = (e) => {
if (disabled.value)
return;
toggle(e);
};
const labelClickHandler = (e) => {
if (labelDisabled.value || disabled.value)
return;
toggle(e);
};
return {
checkboxGroup,
isGroup,
size,
min,
max,
disabled,
modelValue,
checked,
iconClickHandler,
labelClickHandler,
toggle
};
}
const useCheckboxGroupDirectionProp = useDirectionProp;
const checkboxGroupProps = {
customClass: useCustomClassProp,
customStyle: useCustomStyleProp,
modelValue: makeArrayProp(),
size: useCheckboxSizeProp,
direction: useCheckboxGroupDirectionProp,
min: makeNumberProp(-1),
max: makeNumberProp(-1),
disabled: Boolean,
labelDisabled: Boolean
};
const checkboxGroupEmits = {
[UPDATE_MODEL_EVENT]: (val) => isArray(val),
[CHANGE_EVENT]: (val) => isArray(val)
};
const useFieldTypeProp = {
type: String,
validator: (value) => ["text", "number", "digit", "password", "textarea"].includes(value),
default: "text"
};
const useFieldLabelAlignProp = {
type: String,
validator: (value) => ["left", "right", "top", "center"].includes(value),
default: "left"
};
const useFieldInputAlignProp = {
type: String,
validator: (value) => ["left", "right"].includes(value),
default: "left"
};
const fieldProps = {
customClass: useCustomClassProp,
customStyle: useCustomStyleProp,
type: useFieldTypeProp,
label: String,
labelAlign: useFieldLabelAlignProp,
inputAlign: useFieldInputAlignProp,
disabled: Boolean,
focus: Boolean,
icon: String,
suffixIcon: String,
showClear: Boolean,
placeholder: String,
modelValue: String,
maxlength: makeNumberProp(-1),
showWordLimit: Boolean
};
const fieldEmits = {
[UPDATE_MODEL_EVENT]: (value) => isString(value),
[CLICK_EVENT]: (evt) => evt instanceof Object,
[FOCUS_EVENT]: () => true,
[BLUR_EVENT]: () => true,
[INPUT_EVENT]: (value) => isString(value),
[CHANGE_EVENT]: (value) => isString(value),
[CLEAR_EVENT]: () => true
};
function useField(props, emit) {
const disabled = vue.computed(() => props.disabled ?? false);
const modelValue = vue.computed(() => props.modelValue || "");
const placeholderText = vue.computed(() => props.placeholder || "");
const isClick = vue.ref(false);
const showPasswordText = vue.ref(false);
const focus = vue.computed(() => props.focus && !props.disabled || isClick.value);
const clickHandler = (evt) => {
evt.stopPropagation();
if (!props.disabled)
isClick.value = true;
};
const focusHandler = () => {
if (!props.disabled)
emit(FOCUS_EVENT);
};
const blurHandler = () => {
isClick.value = false;
emit(BLUR_EVENT);
};
const inputHandler = (e) => {
const _e = e;
emit(UPDATE_MODEL_EVENT, _e.detail.value);
emit(INPUT_EVENT, _e.detail.value);
emit(CHANGE_EVENT, _e.detail.value);
};
const clearHandler = () => {
emit(UPDATE_MODEL_EVENT, "");
emit(INPUT_EVENT, "");
emit(CHANGE_EVENT, "");
emit(CLEAR_EVENT);
};
return {
disabled,
modelValue,
placeholderText,
isClick,
showPasswordText,
focus,
focusHandler,
clickHandler,
blurHandler,
inputHandler,
clearHandler
};
}
const useRadioTypeProp = useTypeProp;
const useRadioSizeProp = useSizeProp;
const radioProps = {
customClass: useCustomClassProp,
customStyle: useCustomStyleProp,
type: useRadioTypeProp,
size: useRadioSizeProp,
variant: useVariantProp,
disabled: Boolean,
modelValue: {
type: [String, Number, Boolean],
default: ""
},
value: {
type: [String, Number, Boolean],
default: ""
},
label: String,
icon: String,
customIcon: Boolean
};
const radioEmits = {
[UPDATE_MODEL_EVENT]: (val) => isString(val) || isNumber(val) || isBoolean(val),
[CHANGE_EVENT]: (val) => isString(val) || isNumber(val) || isBoolean(val)
};
function useRadio(props, emit) {
const radioGroup = vue.inject(radioGroupKey, void 0);
const isGroup = vue.computed(() => !!radioGroup);
const size = vue.computed(() => radioGroup?.size ?? props.size);
const disabled = vue.computed(() => radioGroup?.disabled ? radioGroup?.disabled : props.disabled);
const modelValue = vue.computed(() => isGroup.value ? radioGroup.modelValue : props.modelValue);
const checked = vue.computed(() => isGroup.value ? radioGroup.modelValue === props.value : props.modelValue);
const toggle = (e) => {
e.stopPropagation();
if (disabled.value)
return;
const newValue = typeof modelValue.value === "string" ? props.value : !modelValue.value;
if (isGroup.value)
radioGroup.changeEvent(newValue);
else if (!checked.value)
emit && emit(UPDATE_MODEL_EVENT, newValue);
else
return;
emit && emit(CHANGE_EVENT, newValue);
};
return {
radioGroup,
isGroup,
size,
disabled,
modelValue,
checked,
toggle
};
}
const useRadioGroupDirectionProp = useDirectionProp;
const radioGroupProps = {
customClass: useCustomClassProp,
customStyle: useCustomStyleProp,
modelValue: {
type: [String, Number, Boolean],
default: ""
},
size: useRadioSizeProp,
direction: useRadioGroupDirectionProp,
min: makeNumberProp(-1),
max: makeNumberProp(-1),
disabled: Boolean
};
const radioGroupEmits = radioEmits;
const useSwitchTypeProp = useTypeProp;
const useSwitchSizeProp = useSizeProp;
const switchProps = {
customClass: useCustomClassProp,
customStyle: useCustomStyleProp,
type: useSwitchTypeProp,
size: useSwitchSizeProp,
variant: useVariantProp,
disabled: Boolean,
modelValue: {
type: [String, Number, Boolean],
default: false
},
activeValue: {
type: [String, Number, Boolean],
default: true
},
activeLabel: String,
inactiveValue: {
type: [String, Number, Boolean],
default: false
},
inactiveLabel: String,
showIcon: truthProp,
icon: String,
loading: Boolean,
customIcon: Boolean
};
const switchEmits = {
[UPDATE_MODEL_EVENT]: (val) => isString(val) || isNumber(val) || isBoolean(val),
[CHANGE_EVENT]: (val) => isString(val) || isNumber(val) || isBoolean(val)
};
function useSwitch(props, emit) {
const disabled = vue.computed(() => props.disabled || props.loading);
const modelValue = vue.computed(() => props.modelValue);
const checked = vue.computed(() => props.modelValue === props.activeValue);
function toggle(evt) {
evt.stopPropagation();
if (disabled.value)
return;
const newValue = modelValue.value === props.activeValue ? props.inactiveValue : props.activeValue;
emit(UPDATE_MODEL_EVENT, newValue);
emit(CHANGE_EVENT, newValue);
}
const dotTranslateClasses = vue.computed(() => {
if (props.size === "mini")
return "translate-x-4.5";
if (props.size === "small")
return "translate-x-5.5";
if (props.size === "large")
return "translate-x-7.5";
return "translate-x-6.5";
});
return {
disabled,
modelValue,
checked,
dotTranslateClasses,
toggle
};
}
const actionSheetProps = {
customClass: useCustomClassProp,
customStyle: useCustomStyleProp,
show: Boolean,
actions: makeArrayProp(),
title: String,
cancelText: String,
description: String,
closeable: truthProp,
duration: makeNumberProp(300),
round: truthProp
};
const actionSheetEmits = {
[UPDATE_SHOW_EVENT]: (value) => isBoolean(value),
[OPEN_EVENT]: () => true,
[CLOSE_EVENT]: () => true,
[OPENED_EVENT]: () => true,
[CLOSED_EVENT]: () => true,
[CANCEL_EVENT]: () => true
};
function useActionSheet(props, emit) {
const show = vue.ref(props.show || false);
const showValue = vue.computed({
get: () => props.show || show.value,
set(val) {
if (val)
emit(OPEN_EVENT);
else
emit(CLOSE_EVENT);
show.value = val;
emit(UPDATE_SHOW_EVENT, val);
}
});
const cancelHandler = () => {
showValue.value = false;
emit(CANCEL_EVENT);
};
return {
showValue,
cancelHandler
};
}
const dialogProps = {
customClass: useCustomClassProp,
customStyle: useCustomStyleProp,
show: Boolean,
title: String,
message: String,
showConfirmButton: truthProp,
showCancelButton: Boolean,
confirmButtonText: String,
cancelButtonText: String
};
const dialogEmits = {
[CONFIRM_EVENT]: () => true,
[CANCEL_EVENT]: () => true
};
function useDialog(props, emit) {
const show = vue.ref(props.show || false);
const showValue = vue.computed(() => props.show || show.value);
const dialogStatus = vue.ref({});
const showDialog = (options) => {
dialogStatus.value = {
title: options.title ?? props.title,
message: options.message ?? props.message,
showConfirmButton: options.showConfirmButton ?? props.showConfirmButton,
showCancelButton: options.showCancelButton ?? props.showCancelButton,
confirmButtonText: options.confirmButtonText ?? props.confirmButtonText,
cancelButtonText: options.cancelButtonText ?? props.cancelButtonText
};
show.value = true;
};
const onConfirm = () => {
show.value = false;
emit(CONFIRM_EVENT);
};
const onCancel = () => {
show.value = false;
emit(CANCEL_EVENT);
};
return {
showValue,
dialogStatus,
showDialog,
onConfirm,
onCancel
};
}
const notifyPositionList = ["default", "top", "top-left", "top-right", "bottom", "bottom-left", "bottom-right"];
const useNotifyTypeProp = useTypeProp;
const useNotifyPositionProp = {
type: String,
validator: (value) => notifyPositionList.includes(value),
default: "default"
};
const notifyProps = {
customClass: useCustomClassProp,
customStyle: useCustomStyleProp,
type: useNotifyTypeProp,
position: useNotifyPositionProp,
message: String,
duration: makeNumberProp(300),
showIcon: Boolean,
customIcon: Boolean,
showClose: Boolean
};
const notifyEmits = {
[CLOSE_EVENT]: () => true
};
function useNotify(props, emit) {
const timer = vue.ref();
const visible = vue.ref(false);
const state = vue.ref({});
function close() {
if (timer.value)
clearTimeout(timer.value);
visible.value = false;
emit(CLOSE_EVENT);
}
function show(options = {}) {
state.value = {
type: options.type ?? "primary",
position: options.position ?? props.position,
message: options.message ?? props.message,
duration: options.duration ?? props.duration,
showIcon: options.showIcon ?? props.showIcon,
customIcon: options.customIcon ?? props.customIcon,
showClose: options.showClose ?? props.showClose
};
visible.value = true;
if (timer.value)
clearTimeout(timer.value);
timer.value = setTimeout(close, state.value.duration);
}
const classes = vue.computed(() => {
return [
state.value?.position === "default" && "top-0 left-0 right-0",
state.value?.position === "top" && "top-0 left-5 right-5 pt-5",
state.value?.position === "top-left" && "top-0 left-0 pt-5 pl-5",
state.value?.position === "top-right" && "top-0 right-0 pt-5 pr-5",
state.value?.position === "bottom" && "!top-auto bottom-0 left-5 right-5 mb-safe pb-5",
state.value?.position === "bottom-left" && "!top-auto bottom-5 left-5 mb-safe pl-5",
state.value?.position === "bottom-right" && "!top-auto bottom-5 right-5 mb-safe pr-5"
];
});
return {
visible,
state,
classes,
show,
close
};
}
const overlayProps = {
customClass: useCustomClassProp,
customStyle: useCustomStyleProp,
show: Boolean,
duration: makeNumberProp(200)
};
const overlayEmits = {
[CLICK_EVENT]: (evt) => evt instanceof Object
};
function useOverlay(props, emit) {
const showValue = vue.computed(() => props.show || false);
const clickHandler = (evt) => {
emit(CLICK_EVENT, evt);
};
return {
showValue,
clickHandler
};
}
const collapseProps = {
customClass: useCustomClassProp,
customStyle: useCustomStyleProp,
modelValue: {
type: [String, Number, Array]
},
accordion: Boolean
};
const collapseEmits = {
[UPDATE_MODEL_EVENT]: (val) => isString(val) || isNumber(val) || isArray(val),
[CHANGE_EVENT]: (val) => isString(val) || isNumber(val) || isArray(val)
};
function useCollapse(props, emit) {
const activeNames = vue.ref(toArray(props.modelValue));
function setActiveNames(_activeNames) {
activeNames.value = _activeNames;
const value = props.accordion ? activeNames.value[0] : activeNames.value;
emit(UPDATE_MODEL_EVENT, value);
emit(CHANGE_EVENT, value);
}
function handleItemClick(name) {
if (props.accordion) {
setActiveNames([activeNames.value[0] === name ? "" : name]);
} else {
const _activeNames = [...activeNames.value];
const index = _activeNames.indexOf(name);
if (index > -1)
_activeNames.splice(index, 1);
else
_activeNames.push(name);
setActiveNames(_activeNames);
}
}
vue.watch(
() => props.modelValue,
() => activeNames.value = toArray(props.modelValue),
{ deep: true }
);
vue.provide(collapseContextKey, {
activeNames,
handleItemClick
});
return {
activeNames,
setActiveNames
};
}
const noticeBarProps = {
customClass: useCustomClassProp,
customStyle: useCustomStyleProp,
type: useTypeProp,
variant: useVariantProp,
show: truthProp,
loop: Boolean,
icon: String,
showClose: Boolean
};
const noticeBarEmits = {
[CLOSE_EVENT]: () => true
};
function useNoticeBar(props, emit) {
const handleClose = () => {
emit(CLOSE_EVENT);
};
return {
handleClose
};
}
const useTagTypeProp = useTypeProp;
const useTagSizeProp = useSizeProp;
const tagProps = {
customClass: useCustomClassProp,
customStyle: useCustomStyleProp,
type: useTagTypeProp,
size: useTagSizeProp,
variant: useVariantProp,
label: String,
disabled: Boolean,
show: truthProp,
closable: Boolean,
icon: String,
iconOnly: Boolean
};
const tagEmits = {
[CLICK_EVENT]: (evt) => evt instanceof Object,
[CLOSE_EVENT]: (evt) => evt instanceof Object
};
function useTag(props, emit) {
const disabled = vue.computed(() => props.disabled);
function clickHandler(evt) {
if (disabled.value)
return;
emit(CLICK_EVENT, evt);
}
function closeHandler(evt) {
if (props.disabled)
return;
emit(CLOSE_EVENT, evt);
}
const classes = vue.computed(() => [
`a-${props.type}`,
props.type === "default" && "a-type-default",
`a-tag-${props.size}`,
`a-${props.variant}`,
{ "!p-0.5 aspect-square": props.iconOnly },
{ "op-50": disabled.value }
]);
return {
disabled,
classes,
clickHandler,
closeHandler
};
}
const useBadgeProp = useTypeProp;
const useBadgeOffsetProp = {
type: Array
};
const badgeProps = {
customClass: useCustomClassProp,
customStyle: useCustomStyleProp,
type: useBadgeProp,
color: String,
dot: Boolean,
offset: useBadgeOffsetProp,
showZero: truthProp,
max: Number,
value: numericProp,
processing: Boolean
};
const tabBarItemEmits = {
[CLICK_EVENT]: (evt) => evt instanceof Object,
[UPDATE_MODEL_EVENT]: (val) => isString(val) || isNumber(val),
[CHANGE_EVENT]: (val) => isString(val) || isNumber(val)
};
const tabBarProps = {
customClass: useCustomClassProp,
customStyle: useCustomStyleProp,
modelValue: makeNumericProp("")
};
const tabBarEmits = tabBarItemEmits;
const navBarProps = {
customClass: useCustomClassProp,
customStyle: useCustomStyleProp,
title: String,
height: numericProp,
fixed: Boolean,
zIndex: numericProp,
border: truthProp,
leftText: String,
rightText: String,
leftArrow: Boolean,
placeholder: Boolean,
clickable: truthProp
};
const navBarEmits = {
clickLeft: (evt) => evt instanceof Object,
clickRight: (evt) => evt instanceof Object
};
function useNavBar(props, emit) {
const systemInfo = uni.getSystemInfoSync();
const navBarRef = vue.ref();
const statusBarHeight = systemInfo.statusBarHeight ?? 0;
const navBarHeight = vue.computed(() => {
const propsHeight = Number(props.height);
let defaultHeight = 44;
if (props.fixed) {
const menuButtonInfo = uni.getMenuButtonBoundingClientRect();
const menuHeight = menuButtonInfo.height;
const menuTop = menuButtonInfo.top;
defaultHeight = (menuTop - statusBarHeight) * 2 + menuHeight;
}
return propsHeight || defaultHeight;
});
const className = vue.computed(() => {
const { fixed, border } = props;
return [
{
"a-nav-bar-fixed": fixed,
"a-hairline-bottom": border
}
];
});
const clickableClassName = vue.computed(() => {
const { clickable } = props;
let className2 = "";
className2 = clickable ? "cursor-pointer a-nav-bar-clickable-hover-h5" : "";
return className2;
});
const navBarStyle = vue.computed(() => {
return props.fixed ? {
paddingTop: `${statusBarHeight}px`
} : {};
});
const navBarContentStyle = vue.computed(() => {
return {
height: `${navBarHeight.value}px`
};
});
const placeholderStyle = vue.computed(() => {
return { width: "100%", height: `${navBarHeight.value + statusBarHeight}px` };
});
const zIndexStyle = vue.computed(() => {
return props.zIndex ? {
zIndex: Number(props.zIndex)
} : {};
});
const slots = vue.useSlots();
const hasLeft = vue.computed(() => props.leftArrow || props.leftText || slots.left);
const hasRight = vue.computed(() => props.rightText || slots.right);
const clickLeftHandler = (evt) => {
emit("clickLeft", evt);
};
const clickRightHandler = (evt) => {
emit("clickRight", evt);
};
return {
navBarRef,
hasLeft,
hasRight,
className,
clickableClassName,
zIndexStyle,
placeholderStyle,
navBarStyle,
navBarContentStyle,
navBarHeight,
statusBarHeight,
clickLeftHandler,
clickRightHandler
};
}
function AnoResolver() {
return {
type: "component",
resolve: (name) => {
if (name.match(/^A[A-Z]/))
return { name, from: `ano-ui/components/${name}/${name}.vue` };
}
};
}
exports.AnoResolver = AnoResolver;
exports.PositionProp = PositionProp;
exports.actionSheetEmits = actionSheetEmits;
exports.actionSheetProps = actionSheetProps;
exports.avatarEmits = avatarEmits;
exports.avatarGroupEmits = avatarGroupEmits;
exports.avatarGroupProps = avatarGroupProps;
exports.avatarProps = avatarProps;
exports.badgeProps = badgeProps;
exports.buttonEmits = buttonEmits;
exports.buttonProps = buttonProps;
exports.cellEmits = cellEmits;
exports.cellGroupKey = cellGroupKey;
exports.cellProps = cellProps;
exports.checkboxEmits = checkboxEmits;
exports.checkboxGroupEmits = checkboxGroupEmits;
exports.checkboxGroupKey = checkboxGroupKey;
exports.checkboxGroupProps = checkboxGroupProps;
exports.checkboxProps = checkboxProps;
exports.collapseContextKey = collapseContextKey;
exports.collapseEmits = collapseEmits;
exports.collapseProps = collapseProps;
exports.createDeferred = createDeferred;
exports.delay = delay;
exports.dialogEmits = dialogEmits;
exports.dialogProps = dialogProps;
exports.fieldEmits = fieldEmits;
exports.fieldProps = fieldProps;
exports.guid = guid;
exports.is = is;
exports.isArray = isArray;
exports.isBoolean = isBoolean;
exports.isDate = isDate;
exports.isDef = isDef;
exports.isElement = isElement;
exports.isEmpty = isEmpty;
exports.isFunction = isFunction;
exports.isMap = isMap;
exports.isNull = isNull;
exports.isNullAndUnDef = isNullAndUnDef;
exports.isNullOrUnDef = isNullOrUnDef;
exports.isNumber = isNumber;
exports.isObject = isObject;
exports.isPromise = isPromise;
exports.isRegExp = isRegExp;
exports.isString = isString;
exports.isUnDef = isUnDef;
exports.isUrl = isUrl;
exports.isWindow = isWindow;
exports.makeArrayProp = makeArrayProp;
exports.makeNumberProp = makeNumberProp;
exports.makeNumericProp = makeNumericProp;
exports.makeRequiredProp = makeRequiredProp;
exports.makeStringProp = makeStringProp;
exports.navBarEmits = navBarEmits;
exports.navBarProps = navBarProps;
exports.noop = noop;
exports.noticeBarEmits = noticeBarEmits;
exports.noticeBarProps = noticeBarProps;
exports.notifyEmits = notifyEmits;
exports.notifyPositionList = notifyPositionList;
exports.notifyProps = notifyProps;
exports.numericProp = numericProp;
exports.overlayEmits = overlayEmits;
exports.overlayProps = overlayProps;
exports.popupEmits = popupEmits;
exports.popupProps = popupProps;
exports.radioEmits = radioEmits;
exports.radioGroupEmits = radioGroupEmits;
exports.radioGroupKey = radioGroupKey;
exports.radioGroupProps = radioGroupProps;
exports.radioProps = radioProps;
exports.switchEmits = switchEmits;
exports.switchProps = switchProps;
exports.tabBarEmits = tabBarEmits;
exports.tabBarProps = tabBarProps;
exports.tagEmits = tagEmits;
exports.tagProps = tagProps;
exports.toArray = toArray;
exports.toastEmits = toastEmits;
exports.toastProps = toastProps;
exports.truthProp = truthProp;
exports.unknownProp = unknownProp;
exports.useActionSheet = useActionSheet;
exports.useAvatar = useAvatar;
exports.useAvatarGroup = useAvatarGroup;
exports.useAvatarSizeProp = useAvatarSizeProp;
exports.useBadgeOffsetProp = useBadgeOffsetProp;
exports.useBadgeProp = useBadgeProp;
exports.useButton = useButton;
exports.useButtonSizeProp = useButtonSizeProp;
exports.useButtonTypeProp = useButtonTypeProp;
exports.useCell = useCell;
exports.useCheckbox = useCheckbox;
exports.useCheckboxGroupDirectionProp = useCheckboxGroupDirectionProp;
exports.useCheckboxSizeProp = useCheckboxSizeProp;
exports.useCheckboxTypeProp = useCheckboxTypeProp;
exports.useCollapse = useCollapse;
exports.useCustomClassProp = useCustomClassProp;
exports.useCustomStyleProp = useCustomStyleProp;
exports.useDialog = useDialog;
exports.useDirectionProp = useDirectionProp;
exports.useField = useField;
exports.useFieldInputAlignProp = useFieldInputAlignProp;
exports.useFieldLabelAlignProp = useFieldLabelAlignProp;
exports.useFieldTypeProp = useFieldTypeProp;
exports.useNavBar = useNavBar;
exports.useNoticeBar = useNoticeBar;
exports.useNotify = useNotify;
exports.useNotifyPositionProp = useNotifyPositionProp;
exports.useNotifyTypeProp = useNotifyTypeProp;
exports.useOverlay = useOverlay;
exports.usePopup = usePopup;
exports.useQuerySelector = useQuerySelector;
exports.useQuerySelectorAll = useQuerySelectorAll;
exports.useRadio = useRadio;
exports.useRadioGroupDirectionProp = useRadioGroupDirectionProp;
exports.useRadioSizeProp = useRadioSizeProp;
exports.useRadioTypeProp = useRadioTypeProp;
exports.useSizeProp = useSizeProp;
exports.useSwitch = useSwitch;
exports.useSwitchSizeProp = useSwitchSizeProp;
exports.useSwitchTypeProp = useSwitchTypeProp;
exports.useTag = useTag;
exports.useTagSizeProp = useTagSizeProp;
exports.useTagTypeProp = useTagTypeProp;
exports.useToast = useToast;
exports.useTypeProp = useTypeProp;
exports.useVariantProp = useVariantProp;
Object.keys(preset).forEach(function (k) {
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) exports[k] = preset[k];
});