UNPKG

@codady/axui

Version:

The AXUI front-end framework is built on HTML5, CSS3, and JavaScript standards, with TypeScript used for type management. It has no library dependencies and is designed to meet diverse needs with a focus on design.

1,321 lines (1,278 loc) 1.36 MB
/*! * @since Last modified: 2025-4-14 1:29:46 * @name AXUI front-end framework. * @version 3.0.36 * @author AXUI development team <3217728223@qq.com> * @description The AXUI front-end framework is built on HTML5, CSS3, and JavaScript standards, with TypeScript used for type management. * @see {@link https://www.axui.cn|Official website} * @see {@link https://github.com/codady/axui/issues|github issues} * @see {@link https://gitee.com/codady/axui/issues|Gitee issues} * @see {@link https://www.npmjs.com/package/@codady/axui|NPM} * @issue QQ Group No.1:952502085 * @copyright This software supports the MIT License, allowing free learning and commercial use, but please retain the terms 'ax,' 'axui,' 'AX,' and 'AXUI' within the software. * @license MIT license */ var tmp = /*#__PURE__*/Object.freeze({ __proto__: null, get Accordion () { return Accordion; }, get AccordionElem () { return AccordionElem; }, get AlarmElem () { return AlarmElem; }, get AnchorsElem () { return AnchorsElem; }, get Autocomplete () { return Autocomplete; }, get AvatarElem () { return AvatarElem; }, get BadgeElem () { return BadgeElem; }, get BtnElem () { return BtnElem; }, get BuoyElem () { return BuoyElem; }, get CalloutElem () { return CalloutElem; }, get CheckboxElem () { return CheckboxElem; }, get CheckboxesElem () { return CheckboxesElem; }, get CompBase () { return CompBase; }, get CompBaseComm () { return CompBaseComm; }, get CompBaseCommField () { return CompBaseCommField; }, get CompBaseCommFieldMixin () { return CompBaseCommFieldMixin; }, get Datetime () { return Datetime; }, get DatetimeElem () { return DatetimeElem; }, get DeformElem () { return DeformElem; }, get Dialog () { return Dialog; }, get DividerElem () { return DividerElem; }, get Dodge () { return Dodge; }, get Drag () { return Drag; }, get Drawer () { return Drawer; }, get Dropdown () { return Dropdown; }, get Editor () { return Editor; }, get EditorElem () { return EditorElem; }, get FieldsElem () { return FieldsElem; }, get FileElem () { return FileElem; }, get FlagElem () { return FlagElem; }, get Flip () { return Flip; }, get FormatElem () { return FormatElem; }, get Gesture () { return Gesture; }, get GoodElem () { return GoodElem; }, get HeadingElem () { return HeadingElem; }, get Hover () { return Hover; }, get IconElem () { return IconElem; }, get Infinite () { return Infinite; }, get InputElem () { return InputElem; }, get Lazy () { return Lazy; }, get LineElem () { return LineElem; }, get Masonry () { return Masonry; }, get Menu () { return Menu; }, get MenuElem () { return MenuElem; }, get Message () { return Message; }, get ModBase () { return ModBase; }, get ModBaseListen () { return ModBaseListen; }, get ModBaseListenCache () { return ModBaseListenCache; }, get ModBaseListenCacheBubble () { return ModBaseListenCacheBubble; }, get ModBaseListenCacheNest () { return ModBaseListenCacheNest; }, get More () { return More; }, get MoreElem () { return MoreElem; }, get NumberElem () { return NumberElem; }, get Observe () { return Observe; }, get Pagination () { return Pagination; }, get PaginationElem () { return PaginationElem; }, get Panel () { return Panel; }, get Popup () { return Popup; }, get Position () { return Position; }, get Progress () { return Progress; }, get ProgressElem () { return ProgressElem; }, get RadioElem () { return RadioElem; }, get RadiosElem () { return RadiosElem; }, get Range () { return Range; }, get RangeElem () { return RangeElem; }, get Rate () { return Rate; }, get RateElem () { return RateElem; }, get ResultElem () { return ResultElem; }, get Retrieval () { return Retrieval; }, get Router () { return Router; }, get Scroll () { return Scroll; }, get SearchElem () { return SearchElem; }, get Select () { return Select; }, get SelectElem () { return SelectElem; }, get SkeletonElem () { return SkeletonElem; }, get Spy () { return Spy; }, get StatsElem () { return StatsElem; }, get StatusElem () { return StatusElem; }, get StepElem () { return StepElem; }, get Swipe () { return Swipe; }, get Tab () { return Tab; }, get Tags () { return Tags; }, get TextareaElem () { return TextareaElem; }, get Tooltip () { return Tooltip; }, get Tree () { return Tree; }, get TreeElem () { return TreeElem; }, get TwilightElem () { return TwilightElem; }, get Upload () { return Upload; }, get UploadElem () { return UploadElem; }, get Valid () { return Valid; }, get Virtualize () { return Virtualize; }, get addStyle () { return addStyle; }, get addStyles () { return addStyles; }, get ajax () { return ajax; }, get alert () { return alert; }, get alias () { return alias; }, get allToEls () { return allToEls; }, get appendEls () { return appendEls; }, get arrSearch () { return arrSearch; }, get arrSort () { return arrSort; }, get attrJoinVal () { return attrJoinVal; }, get attrToJson () { return attrToJson; }, get attrValBool () { return attrValBool; }, get augment () { return augment; }, get ax () { return ax; }, get breakpoints () { return breakpoints; }, get bulletTools () { return bulletTools; }, get capStart () { return capStart; }, get clampVal () { return clampVal; }, get classes () { return classes; }, get clearRegx () { return clearRegx; }, get combineArr () { return combineArr; }, get config () { return config; }, get confirm () { return confirm; }, get contains () { return contains; }, get convertByte () { return convertByte; }, get createBtns () { return createBtns; }, get createComp () { return createComp; }, get createEl () { return createEl; }, get createEvt () { return createEvt; }, get createFooter () { return createFooter; }, get createModule () { return createModule; }, get createTools () { return createTools; }, get curveFns () { return curveFns; }, get dateTools () { return dateTools; }, get debounce () { return debounce; }, get decompTask () { return decompTask; }, get deepClone () { return deepClone; }, get deepEqual () { return deepEqual; }, get deepMerge () { return deepMerge; }, get default () { return ax_comm; }, get delay () { return delay; }, get dl2Tree () { return dl2Tree; }, get ease () { return ease; }, get easeHeight () { return easeHeight; }, get elProps () { return elProps; }, get elState () { return elState; }, get elsSort () { return elsSort; }, get eventMap () { return eventMap; }, get events () { return events; }, get extend () { return extend; }, get fadeIn () { return fadeIn; }, get fadeOut () { return fadeOut; }, get fadeToggle () { return fadeToggle; }, get fieldTools () { return fieldTools; }, get fieldTypes () { return fieldTypes; }, get fileTools () { return fileTools; }, get filterPrims () { return filterPrims; }, get findItem () { return findItem; }, get findItems () { return findItems; }, get formTools () { return formTools; }, get getArrMap () { return getArrMap; }, get getAttrArr () { return getAttrArr; }, get getAttrBool () { return getAttrBool; }, get getAutoDur () { return getAutoDur; }, get getBetweenEls () { return getBetweenEls; }, get getClasses () { return getClasses; }, get getClientObj () { return getClientObj; }, get getComputedVar () { return getComputedVar; }, get getContent () { return getContent; }, get getDataType () { return getDataType; }, get getEl () { return getEl; }, get getElSpace () { return getElSpace; }, get getEls () { return getEls; }, get getEvtClient () { return getEvtClient; }, get getEvtTarget () { return getEvtTarget; }, get getExpiration () { return getExpiration; }, get getFullGap () { return getFullGap; }, get getHeights () { return getHeights; }, get getHypotenuse () { return getHypotenuse; }, get getImgAvatar () { return getImgAvatar; }, get getImgEmpty () { return getImgEmpty; }, get getImgNone () { return getImgNone; }, get getImgSpin () { return getImgSpin; }, get getImgSpinDk () { return getImgSpinDk; }, get getIntArr () { return getIntArr; }, get getLast () { return getLast; }, get getNestProp () { return getNestProp; }, get getPlaces () { return getPlaces; }, get getRectPoints () { return getRectPoints; }, get getScreenSize () { return getScreenSize; }, get getScrollObj () { return getScrollObj; }, get getSelectorType () { return getSelectorType; }, get getStrFromTpl () { return getStrFromTpl; }, get getUTCTimestamp () { return getUTCTimestamp; }, get getValsFromAttrs () { return getValsFromAttrs; }, get getWidths () { return getWidths; }, get hide () { return hide; }, get icons () { return icons; }, get includes () { return includes; }, get increaseId () { return increaseId; }, get init () { return init; }, get instance () { return instance; }, get isDateStr () { return isDateStr; }, get isEmpty () { return isEmpty; }, get isMobi () { return isMobi; }, get isNull () { return isNull; }, get isOutside () { return isOutside; }, get isProxy () { return isProxy; }, get isScrollUp () { return isScrollUp; }, get isSubset () { return isSubset; }, get keyCond () { return keyCond; }, get moveItem () { return moveItem; }, get notice () { return notice; }, get offset () { return offset; }, get paramToJson () { return paramToJson; }, get parseStr () { return parseStr; }, get parseUrlArr () { return parseUrlArr; }, get pipe () { return pipe; }, get plan () { return plan; }, get prefix () { return prefix; }, get preventDft () { return preventDft; }, get privacy () { return privacy; }, get prompt () { return prompt; }, get propsMap () { return propsMap; }, get purifyHtml () { return purifyHtml; }, get regElem () { return regElem; }, get regExps () { return regExps; }, get removeItem () { return removeItem; }, get removeStyle () { return removeStyle; }, get removeStyles () { return removeStyles; }, get renderTpl () { return renderTpl; }, get repeatStr () { return repeatStr; }, get replaceFrag () { return replaceFrag; }, get requireTypes () { return requireTypes; }, get scrollTo () { return scrollTo; }, get select2Tree () { return select2Tree; }, get setAttr () { return setAttr; }, get setAttrs () { return setAttrs; }, get setContent () { return setContent; }, get setSingleSel () { return setSingleSel; }, get show () { return show; }, get sliceFrags () { return sliceFrags; }, get sliceStrEnd () { return sliceStrEnd; }, get slideDown () { return slideDown; }, get slideToggle () { return slideToggle; }, get slideUp () { return slideUp; }, get splice () { return splice; }, get splitNum () { return splitNum; }, get spreadBool () { return spreadBool; }, get startUpper () { return startUpper; }, get stdParam () { return stdParam; }, get storage () { return storage; }, get strToJson () { return strToJson; }, get style () { return style; }, get support () { return support; }, get theme () { return theme; }, get throttle () { return throttle; }, get toLocalTime () { return toLocalTime; }, get toNumber () { return toNumber; }, get toPixel () { return toPixel; }, get toggle () { return toggle; }, get tplToEl () { return tplToEl; }, get tplToEls () { return tplToEls; }, get transformTools () { return transformTools; }, get treeTools () { return treeTools; }, get trim () { return trim; }, get ul2Tree () { return ul2Tree; }, get unique () { return unique; }, get valToArr () { return valToArr; }, get validTools () { return validTools; } }); const getComputedVar = (name) => getComputedStyle(document.documentElement).getPropertyValue(name).trim(); const prefix = getComputedVar(`--PREFIX`); const alias = getComputedVar(`--ALIAS`); const lang = { name: 'zh-CN', support: { content: '由于AXUI使用了<code>:has</code>的css伪类选择器,而您的浏览器相对陈旧,请更新至<code>Chrome105</code>以上内核的浏览器!', cancel: '下次再提醒我', confirm: '我知道了' }, privacy: { content: '我们使用Cookie来确保您在我们的网站上获得最佳体验,并为您提供个性化服务。继续浏览即表示您同意我们的Cookie政策。', cancel: '拒绝', confirm: '接受' }, ajax: { abort: `<i class="${prefix}c-warn">中止了请求!</i>`, timeout: `<i class="${prefix}c-error">请求超时了!</i>`, error: `<i class="${prefix}c-error">错误状态:{{this.status}}</i>`, submit: { btn: '正在提交', succ: '恭喜,提交成功!', fail: '对不起,提交失败!', } }, more: { unfold: '收起', fold: '折叠', }, button: { default: '新按钮', confirm: '确定', cancel: '取消', clear: '清除', close: '关闭', reset: '重置', submit: '提交', now: '现在', prev: '上一个', next: '下一个' }, placehold: { note: '请写上备注内容!', fileName: '新文件', downloadName: '下载文件', }, form: { placeholder: '请输入...', fileLabel: '请选择文件...', fileMulti: '{{this.data}}个文件:', maxLength: '最多可输入{{this.total}}个字符,已输入{{this.value}}个,还可以输入{{this.remaining}}个。', minLength: '至少输入{{this.min}}个字符,已输入{{this.value}}个,还要输入{{this.remaining}}个。', limitLength: '至少输入{{this.min}}个字符,最多可输入{{this.max}}个字符,已输入{{this.value}}个。', maxNumber: '最大取值{{this.max}}。', minNumber: '最小取值{{this.min}}。', limitNumber: '取值范围{{this.min}}~{{this.max}}。', exceed: '已超限。', range: '取值范围{{this.min}}~{{this.max}}。', }, range: { result: `结果:{{this.multiple?this.range[0]+'-'+this.range[1]:this.value}}`, }, valid: { regLocal: '\u4e00-\u9fa5', types: { 'a': '小写字母', 'A': '大写字母', 'd': '数字', '~': '特殊字符', '@': '中文字符', }, message: { wrongRule: '校验规则错误,请修正!', wrongFormat: '值格式错误,应该为文本格式!', noValids: '表单没有任何校验字段!', }, strFormat: '值格式错误,应该为文本格式!', arrFormat: '参数格式错误,应该为数组格式!', succ: '{{ this.label || "" }}通过校验!', fail: '{{ this.label || "" }}校验失败!', required: '{{ this.label }}是必填项!', email: '{{ this.label }}请填写正确的邮箱!', cellphone: '{{ this.label }}请填写11位手机号!', landline: '{{ this.label }}请填写正确的座机号码!', ip: '{{ this.label }}请填写正确的IP地址!', id: '{{ this.label }}请填写正确的身份证号!', zip: '{{ this.label }}只能填写6位数字邮编!', url: '{{ this.label }}请填写正确的域名!', plate: '{{ this.label }}请填写正确的车牌号!', locale: '{{ this.label }}只能填写中文!', letter: '{{ this.label }}只能填写大小写英文字母!', string: '{{ this.label }}只能填写大小写英文字母和数字!', password: '{{ this.label }}只能填写大小写英文字母、数字以及特殊字符!', ymdhms: '{{ this.label }}只能填写类似2022-11-13 2:56:12的日期格式!', ymd: '{{ this.label }}只能填写类似2022-11-13的日期格式!', hms: '{{ this.label }}只能填写类似2:56:12的日期格式!', ym: '{{ this.label }}只能填写类似2022-11的日期格式!', y: '{{ this.label }}只能填写4位数字年份!', m: '{{ this.label }}只能填写1~12月份!', d: '{{ this.label }}只能填写1~31日!', date: '{{ this.label }}请填写有效的日期!', integer: '{{ this.label }}只能填写非0开头的正整数!', number: '{{ this.label }}只能填写数字,包括正数、负数、整数、小数!', 'date=': '{{ this.label }}只能是{{ this.data }}!', 'date>': '{{ this.label }}需超过{{ this.data }}!', 'date>=': '{{ this.label }}不可早于{{ this.data }}!', 'date<': '{{ this.label }}不可超过{{ this.data }}!', 'date<=': '{{ this.label }}不可晚于{{ this.data }}!', 'date><': '{{ this.label }}需超过{{ this.data[0] }},且不可超过{{ this.data[1] }}!', 'date><=': '{{ this.label }}需超过{{ this.data[0] }},且不可超过或等于{{ this.data[1] }}!', 'date>=<': '{{ this.label }}需超过或等于{{ this.data[0] }},且不可超过{{ this.data[1] }}!', 'date>=<=': '{{ this.label }}不可早于{{ this.data[0] }},且不可晚于{{ this.data[1] }}!', 'than=': '{{ this.label }}需要等于{{ this.data }}!', 'than>': '{{ this.label }}需要大于{{ this.data }}!', 'than>=': '{{ this.label }}需要大于或等于{{ this.data }}!', 'than<': '{{ this.label }}需要小于{{ this.data }}!', 'than<=': '{{ this.label }}需要小于或等于{{ this.data }}!', 'than><': '{{ this.label }}需要大于{{ this.data[0] }},且小于{{ this.data[1] }}!', 'than><=': '{{ this.label }}需要大于{{ this.data[0] }}个,且小于等于{{ this.data[1] }}!', 'than>=<': '{{ this.label }}需要大于等于{{ this.data[0] }}个,且小于{{ this.data[1] }}!', 'than>=<=': '{{ this.label }}需要大于等于{{ this.data[0] }}个,且小于等于{{ this.data[1] }}!', 'length=': '{{ this.label }}已输入{{ this.value.length }}个字符,只能填写{{ this.data }}个字符!', 'length>': '{{ this.label }}已输入{{ this.value.length }}个字符,字符数量需多于{{ this.data }}个!', 'length>=': '{{ this.label }}已输入{{ this.value.length }}个字符,字符数量不可少于{{ this.data }}个!', 'length<': '{{ this.label }}已输入{{ this.value.length }}个字符,字符数量需少于{{ this.data }}个!', 'length<=': '{{ this.label }}已输入{{ this.value.length }}个字符,字符数量不可多于{{ this.data }}个!', 'length><': '{{ this.label }}已输入{{ this.value.length }}个字符,字符数量需多于{{ this.data[0] }}个,且少于{{ this.data[1] }}个!', 'length><=': '{{ this.label }}已输入{{ this.value.length }}个字符,字符数量需多于{{ this.data[0] }}个,且少于或等于{{ this.data[1] }}个!', 'length>=<': '{{ this.label }}已输入{{ this.value.length }}个字符,字符数量需多于或等于{{ this.data[0] }}个,且少于{{ this.data[1] }}个!', 'length>=<=': '{{ this.label }}已输入{{ this.value.length }}个字符,字符数量不可少于{{ this.data[0] }}个,且不可多于{{ this.data[1] }}个!', 'count=': '{{ this.label }}有{{ this.value }}项,必须且只能选择{{ this.data }}项!', 'count>': '{{ this.label }}有{{ this.value }}项,选择项需要多于{{ this.data }}!', 'count>=': '{{ this.label }}有{{ this.value }}项,至少选择{{ this.data }}项!', 'count<': '{{ this.label }}有{{ this.value }}项,选择项需要少于{{ this.data }}!', 'count<=': '{{ this.label }}有{{ this.value }}项,最多选择{{ this.data }}项!', 'count><': '{{ this.label }}有{{ this.value }}项,选择项需多于{{ this.data[0] }},且少于{{ this.data[1] }}!', 'count><=': '{{ this.label }}有{{ this.value }}项,选择项需多于{{ this.data[0] }},且少于或等于{{ this.data[1] }}!', 'count>=<': '{{ this.label }}有{{ this.value }}项,选择项需多于或等于{{ this.data[0] }},且少于{{ this.data[1] }}!', 'count>=<=': '{{ this.label }}有{{ this.value }}项,至少选择{{ this.data[0] }}项,且不能多于{{ this.data[1] }}项!', include: '{{ this.label }}的值应该在"{{ this.data }}"之中!', exclude: '{{ this.label }}的值不能在"{{ this.data }}"之中!', same: '{{ this.label }}字段值与"{{ this.data[1] || this.data[0] }}"字段值不一致!', different: '{{ this.label }}字段值不能与"{{ this.data[1] || this.data[0] }}"字段值一致!', strength: '{{ this.label }}的当前强度为{{ this.value}},要求达到{{ this.data }}!', specific: `{{ this.label }}要求{{ for(let k in this.data){/}}{{k+'至少'+this.data[k]+'个'}}{{ (Object.keys(this.data).slice(-1)[0] !== k)? ',':''}}{{}/}}!`, combine: `{{ this.label }}要求{{ this.data.types.join('、') }}至少{{ this.data.total }}种!`, }, status: { warn: '有警告', succ: '完成了', error: '有报错', issue: '有疑问', info: '有消息', confirm: '已确认', cancel: '已取消', forbid: '已禁用' }, message: { heading: { warn: '操作警告!', succ: '操作成功!', error: '操作失败!', issue: '操作疑问!', info: '信息提示!', }, content: { warn: '警告!运行过程中可能存在故障,请注意排查!', succ: '恭喜!运行顺利或者操作成功!', error: '失败!运行过程中发生了错误或操作失败!', issue: '有疑问!运行过程中遇到一些问题需要解决!', info: '提示!运行中未出现状况,请继续!', }, }, tree: { label: '新分支', title: { folder: '新增枝干分支', file: '新增叶子分支', edit: '编辑分支', remove: '删除分支', arrow: '点击折叠或展开', }, message: { remove: '确定要删除"{{this.label}}"分支么', }, paginated: { more: '查看更多', next: '下一页', first: '返回首页', info: '"{{this.label}}"还剩{{this.rest}}条信息', main: '主分支', }, result: `<i ${alias}="holder">还未选择...</i>`, }, accordion: { label: '新板块', content: '新内容', extra: '更多内容', title: { add: '新增板块', edit: '编辑板块', remove: '删除板块', arrow: '点击折叠或展开', }, message: { remove: '确定要删除"{{this.label}}"板块么', }, }, tab: { label: '新标签', content: '新内容', title: { add: '新增页签', edit: '编辑页签', close: '删除页签', move: '移动页签', update: '更新页签', }, message: { add: '确定要新增"{{this.label}}"页签么', edit: '确定要编辑"{{this.label}}"页签么', close: '确定要删除"{{this.label}}"页签么', move: '确定要移动"{{this.label}}"页签么', update: '确定要更新"{{this.label}}"页签么', }, }, flat: { label: '新项目' }, spy: { isObserved: `媒体文件{{ this.src }}已经处于监听状态,不需要添加监听操作!`, isUnobserved: `媒体文件{{ this.src }}还未被监听,不需要取消监听操作!` }, tags: { emptyholder: '还没有创建标签!', placeholder: '请输入...', includePart: '包含了重复的标签!', includeFull: '标签完全重复,添加失败!', }, retrieval: { status: `共有<u>{{this.value}}</u>个结果符合<s>{{this.keys}}</s>要求!`, nullKeys: `没有检索词且没有检索结果!`, }, drag: { holderDrag: '转移中...', holderDrop: '释放到这里...', holderEmpty: '可拖入这里', }, progress: { complete: '已完成!', tips: '当前进度', }, infinite: { finish: '没有更多内容了', error: '请求终止,已停止加载', next: '<ax-btn width="x5">查看更多</ax-btn>', preload: '等待加载数据', loading: '正在加载数据', loaded: '单页数据加载完成!', }, virtualize: { preload: '等待加载数据', }, pagination: { first: '首页', last: '尾页', prev: '上一页', next: '下一页', ellipsis: '...', tips: '{{this.current}}/{{this.pages}}', total: '共有{{this.total}}条数据', locate: '跳到', count: '每页', page: '页', unit: '条', }, datetime: { month: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'], week: ['一', '二', '三', '四', '五', '六', '日'], weeks: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'], year: { prev: '上一页', next: '下一页', placeholder: '输入年份', }, range: { hyphen: '至', checkbox: '选择同一天' }, unit: { Y: '年', M: '月', D: '日', W: '周', h: '时', m: '分', s: '秒', }, bc: '公元前', daytime: { select: '时间选择', start: '开始时间', end: '结束时间' }, toolTip: { restore: '还原初始值', reset: '归零', now: '设为当前时间', close: '关闭时间选择器', }, empty: `<i class="${prefix}c-ignore">还未选择日期!</i>`, message: { requireTwoValue: '区间模式至少需要选择两个日期!', requireYearFormat: '请填入正确的年份格式!', requireOneSelected: '请至少选择一个日期!', }, noEvent: `<i class="${prefix}c-ignore">今天没有需要安排的事项!</i>`, }, rate: { title: { dft: '暂无评星', clear: '评星归零', }, template: { result: `{{this.stars}}星`, tooltip: `{{this.stars}}星,总分:{{this.value}}`, }, star: '星', }, editor: { defer: '点击加载内容', placeholder: '请输入...', path: '路径:', chars: '文字:', paras: '段落:', fontsizeDft: '默认字号', alignDft: '默认排列', tagsDft: '特殊标签', tips: { bold: '加粗', italic: '斜体', through: '删除线', underline: '下划线', alignDft: '默认对齐', alignLeft: '左对齐', alignRight: '右对齐', alignCenter: '居中对齐', alignJustify: '两端对齐', indentMore: '增加缩进', indentLess: '减少缩进', sub: '下标', sup: '上标', highlight: '高亮(MARK)', em: '强调(EM)', ruby: '拼音(RUBY)', rt: '拼音(RT)', address: '地址(ADDRESS)', time: '时间(TIME)', blockquote: '段落引用(BLOCKQUOTE)', cite: '行内引用(CITE)', codeInline: '行内代码(CODE)', codeBlock: '代码块(PRE+CODE)', source: '源码模式', heading: '设置标题', hr: '插入水平线(HR)', br: '插入换行符(BR)', p: '插入段落符(P)', listOl: '有序列表(OL+LI)', listUl: '无序列表(UL+LI)', listCheck: '任务列表(CHECKBOX)', paragraph: '插入段落(DIV+BR)', fontSet: '文字设置', fontSize: '字号大小', fontColor: '文字颜色', fontBg: '文字背景色', h1: '一号标题', h2: '二号标题', h3: '三号标题', h4: '四号标题', h5: '五号标题', h6: '六号标题', text: '正文', } }, select: { placeholder: '请选择...', title: { close: '清空' }, search: { fail: `没有找到符合"{{this.keys}}"的选项`, succ: `找到了{{this.value}}项符合"{{this.keys}}"`, start: '还没有输入检索关键字', placeholder: '请输入关键字...', }, check: { ed: '未勾选,选择全部', ing: '勾选了部分,选择全部', none: '已勾选全部,取消全部' }, stats: `已选择了{{this.value}}/{{this.total}}项`, }, upload: { paste: { before: '点击这里粘贴上传', ing: '请使用ctrl+v组合键', after: '完成了粘贴!', }, tips: { suffix: `支持{{this.value}}格式`, size: `单文件子节数不超过{{this.value}}MB`, min: `至少上传{{this.value}}个文件`, max: `最多上传{{this.value}}个文件`, free: '上传文件未做限制', }, progress: { passed: '文件合格', notPassed: '文件不合格', rendered: '等待上传', uploading: '上传中', uploaded: '已上传', received: '已接收', getAuth: '获取授权中', authorized: '已授权', unauthorized: '未获得授权', failed: '上传失败', }, summary: `提交了{{this.total}}个文件,成功上传了{{this.count}}个,共{{this.size}}`, message: { single: { passed: '通过校验!', max: '文件数量太多,请删除!', size: '文件体积太大,请删除!', suffix: '文件格式错误,请删除!', success: '上传成功!', failed: '提交地址可能错误,请删除!', }, global: { passed: '所有文件通过校验!', min: '请至少上传{{this.value}}个文件!', max: '最多只能上传{{this.value}}个文件,可先删除再添加!', } }, button: { choose: '选择文件', upload: '批量上传', clear: '批量删除', gallery: '点击或拖拽上传', picture: '选择文件', }, thead: ['图示', '文件名', '文件体积', '上传进度', '实时消息', '上传状态', '操作'], }, confirm: { heading: '', }, twilight: { day: '白天', night: '黑夜', }, }; const config = { initial: true, support: false, privacy: false, lang, attrs: { ajaxSpin: `spinning`, ajaxState: `ajax`, }, debounce: 200, throttle: 500, rootStart: -1, idStart: 0, floorStart: 0, pathHyphen: '~', rangeHyphen: '~', labelHyphen: '/', splitHyphen: ',', wordHyphen: ' ', actClass: `${prefix}opened`, reqProp: 'REQRETRY', parser: 'new Function', warn: { init: 'The initialization process of the instance has been stopped. You will need to manually initialize it using the init() method later!', emptyCont: 'Data was not obtained, but execution was not halted!', }, error: { parse: 'Getting data from HTML resulted in an error, an empty array was returned, but execution was not interrupted!', }, message: {}, valid: { regChars: '~!@#$%^&*', lengthStr: 6, }, popup: {}, alert: {}, more: {}, menu: {}, tree: {}, drawer: {}, }; const isNull = (data) => [undefined, null, 'undefined', 'null'].includes(data); const augment = function (arg) { if (isNull(arg) || !arg.name) return; let target; if (!arg.target || arg.target === 'ax') { target = this; } else { for (let k in this) { if (this[k].name === arg.target) { target = this[k]; break; } } if (!target) throw new Error(`Cannot find the ${arg.target} property in the ax object!`); } if (arg.type === 'method') { target[target.prototype ? 'prototype' : '__proto__'][arg.name] = arg.data; } else { Reflect.set(target, arg.name, arg.data); } }; const getDataType = (obj) => { let tmp = Object.prototype.toString.call(obj).slice(8, -1), result; if (tmp === 'Function' && /^\s*class\s+/.test(obj.toString())) { result = 'Class'; } else if (tmp === 'Object' && Object.getPrototypeOf(obj) !== Object.prototype) { result = 'Instance'; } else { result = tmp; } return result; }; const isEmpty = (data) => { let type = getDataType(data), flag; if (!data) { flag = true; } else { flag = (type === 'Object') ? (Object.keys(data).length === 0) : (type === 'Array') ? data.join('') === '' : (type === 'Function') ? (data.toString().replace(/\s+/g, '').match(/{.*}/g)[0] === '{}') : (type === 'Symbol') ? (data.toString().replace(/\s+/g, '').match(/\(.*\)/g)[0] === '()') : false; } return flag; }; const getEl = (obj, wrap) => { let objType = getDataType(obj), parType = getDataType(wrap), parent = parType.includes('HTML') ? wrap : document.querySelector(wrap), result = null; if (obj) { if (objType.includes('HTML')) { result = obj; } else if (objType === 'String') { try { result = (parent || document).querySelector(obj.trim()); } catch { result = null; } } } return result; }; const deepClone = (data) => { let dataType = getDataType(data), result; if (dataType === 'Object') { let newObj = {}, symbols = Object.getOwnPropertySymbols(data); for (let k in data) { newObj[k] = deepClone(data[k]); } if (symbols.length > 0) { for (let k of symbols) { newObj[k] = deepClone(data[k]); } } result = newObj; } else if (dataType === 'Array') { result = data.map((k) => deepClone(k)); } else if (dataType === 'Date') { result = new Date(data); } else { result = data; } return result; }; const deepMerge = (target, source, opt) => { let targetType = getDataType(target), sourceType = getDataType(source), options = Object.assign({ arrAppend: false, propAppend: true, targetClone: false, override: 'partial' }, opt), result = options.targetClone ? deepClone(target) : target; if (targetType !== 'Object' || sourceType !== 'Object') { return result; } for (let k in source) { if (source.hasOwnProperty(k) && result.hasOwnProperty(k)) { let _resultType = getDataType(result[k]), _sourceType = getDataType(source[k]); if (_resultType !== _sourceType) { if (options.override === 'partial' && result.hasOwnProperty(k) && result[k]?.hasOwnProperty('enable') && typeof source[k] === 'boolean') { if (result[k]?.hasOwnProperty('enable') && typeof source[k] === 'boolean') { result[k].enable = source[k]; } else if (source[k]?.hasOwnProperty('enable') && typeof result[k] === 'boolean') { result = Object.assign({ enable: result[k] }, source[k]); } else { result[k] = source[k]; } } else { result[k] = source[k]; } } else { if (_sourceType === 'Object') { result[k] = deepMerge(result[k], source[k], options); } else if (_sourceType === 'Array' && options.arrAppend) { result[k].push(...source[k]); } else { result[k] = source[k]; } } } else if (source.hasOwnProperty(k) && !result.hasOwnProperty(k) && options.propAppend) { result[k] = source[k]; } } let symbols = Object.getOwnPropertySymbols(source); if (symbols.length > 0) { for (let k of symbols) { result[k] = source[k]; } } return result; }; const requireTypes = (data, require, cb) => { let type = getDataType(data).toLowerCase(), types = typeof require === 'string' ? [require] : require; type.includes('html') ? type = 'element' : null; types = types.map((k) => k.toLowerCase()); if (cb) { try { if (!types.includes(type)) { throw new Error(`Wrong data type,Require types: "${'' + types}"!`); } } catch (error) { cb(error); } } else { if (!types.includes(type)) { throw new Error(`Wrong data type,Require types: "${'' + types}"!`); } } }; const parseStr = ({ content = '', type = 'object', method = config.parser, catchable = false, error }) => { let dft = { start: type === 'object' ? '{' : '[', end: type === 'object' ? '}' : ']', return: type === 'object' ? {} : type === 'array' ? [] : null, }, result = dft.return; if (!content) return dft.return; let trim = content.trim(); if (['object', 'array'].includes(type)) { if (!trim.startsWith(dft.start) || !trim.endsWith(dft.end)) return result; } try { let tmp = typeof method === 'function' ? method(trim) : method === 'JSON.parse' ? JSON.parse(trim) : new Function(`"use strict"; return ${trim}`)(); result = tmp; } catch (err) { error && error(err); if (catchable) throw err; } return result; }; const strToJson = (str, type = 'object') => { let dft = type === 'array' ? [] : {}; if (typeof str !== 'string') return dft; str = str.trim(); if (!str) return dft; str = (str.startsWith('[') && str.endsWith(']')) || (str.startsWith('{') && str.endsWith('}')) ? str : `{${str}}`; try { return parseStr({ content: str, type, catchable: true, }); } catch { return dft; } }; const attrToJson = (elem, attr) => { requireTypes(attr, 'string'); let el = getEl(elem), elAttr = el.getAttribute(attr), result = {}; if (el && attr && elAttr) { result = strToJson(elAttr); } return result; }; const extend = ({ target = {}, source = {}, host = null, attr = '' }) => { let targetType = getDataType(target), el = getEl(host); if (targetType !== 'Object') { return target; } else { source && deepMerge(target, source); el && attr && deepMerge(target, attrToJson(el, attr)); } return target; }; const ax = { frame: 0, ajaxStorage: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], prefix, alias, dragNode: null, compSign: 'comp', embedSign: 'embed', namePfx: 'TMP_', messages: [], valids: [], config, augment, tasks: [], install(vue, options) { !isEmpty(options) && extend({ target: this.config, source: options, }); vue.config.globalProperties.$ax = this; } }; const fieldTypes = ['input', 'file', 'textarea', 'range', 'number', 'datetime', 'upload', 'select', 'radio', 'checkbox', 'radios', 'checkboxes']; const renderTpl = (html, data) => { requireTypes(html, 'string'); requireTypes(data, ['array', 'object']); if (!html || Object.keys(data).length === 0) { return ''; } let regStart = '\\{\\{', regEnd = '\\}\\}', exeEnd = '/', tplReg = new RegExp(`${regStart}([\\s\\S]+?)?${regEnd}`, 'g'), code = '"use strict";let str=[];\n', cursor = 0, match, result = '', add = (fragment, isJs) => { isJs ? (code += (fragment.endsWith(exeEnd) ? fragment.replace('=&gt;', '=>').slice(0, -1) + '\n' : 'str.push(' + fragment + ');\n')) : (code += (fragment !== '' ? 'str.push("' + fragment.replace(/"/g, '\\"') + '");\n' : '')); return add; }; while (match = tplReg.exec(html)) { add(html.slice(cursor, match.index))(match[1], true); cursor = match.index + match[0].length; } add(html.slice(cursor)); code += `return str.join('');`; try { result = new Function(code.replace(/[\r\t\n]/g, '')).apply(data); } catch (err) { console.error(`'${err.message}'`, ' in \n', code, '\n'); } return result; }; const getScreenSize = () => getComputedVar(`--SCREEN`); const startUpper = (str) => { str = str.trim(); return str.slice(0, 1).toUpperCase() + str.slice(1); }; const sliceStrEnd = ({ str = '', key = '#', type = 'afterend', contain = true }) => { str = str.toString(); key = key.toString(); let result = '', indexKey = 0, lenKey = key.length, lenEnd = str.length, indexStart = 0; if (!str || !key) { return result; } str = str.trim(); if (str.includes(key)) { if (type === 'beforebegin') { indexKey = str.indexOf(key); contain ? indexKey += lenKey : null; lenEnd = indexKey; } else if (type === 'afterbegin') { indexKey = str.indexOf(key); !contain ? indexKey += lenKey : null; indexStart = indexKey; } else if (type === 'beforeend') { indexKey = str.lastIndexOf(key); contain ? indexKey += lenKey : null; lenEnd = indexKey; } else if (type === 'afterend') { indexKey = str.lastIndexOf(key); !contain ? indexKey += lenKey : null; indexStart = indexKey; } result = str.substring(indexStart, lenEnd); } return result; }; const delay = function ({ duration = 2000, todo, doing, done, frame = 0 }) { if (duration < 0) Promise.reject(new Error('Invalid duration')); todo && todo(frame); return new Promise((resolve, reject) => { try { if (!duration) { done && done(frame); resolve(frame); } let deadline = Date.now() + duration, listen = () => { let newTime = Date.now(); if (newTime >= deadline) { cancelAnimationFrame(frame); done && done(frame); resolve(frame); frame = 0; } else { frame = requestAnimationFrame(listen); doing && doing(frame); } }; listen(); } catch (e) { reject(e); } }); }; const getPlaces = (data) => data.toString().split(".")[1]?.length || 0; const toNumber = (data, opt) => { let result = 0, number = Number(data), options = Object.assign({ places: 10, mode: 'round', zero: false, epsilon: true }, opt); if (!data || !number) { return 0; } if (options.places < 0) { return number; } else { let precise = number + (options.epsilon ? Number.EPSILON : 0), tail = Number(`1${'0'.repeat(options.places)}`), tempPrecise = precise * tail; if (options.mode === 'floor') { result = Math.floor(tempPrecise) / tail; } else if (options.mode === 'ceil') { result = Math.ceil(tempPrecise) / tail; } else { result = Math.round(tempPrecise) / tail; } if (options.zero) { let decPlaces = getPlaces(result); options.places > decPlaces ? result = result + (!decPlaces ? '.' : '') + ('0'.repeat(options.places - decPlaces)) : null; } return result; } }; const toPixel = (data, multiple) => { let result = 0; if (!data) { return result; } multiple = multiple || parseInt(getComputedVar(`--${prefix}fs-base`)) || 10; if (typeof data === 'string') { data = data.trim(); if (data.endsWith('rem') || data.endsWith('REM')) { result = ~~(toNumber(data.replace('rem', '').replace('REM', '')) * multiple); } else if (data.endsWith('px') || data.endsWith('PX')) { result = ~~toNumber(data.replace('px', '').replace('PX', '')); } else { result = ~~data; } } else if (typeof data === 'number') { result = ~~data; } return result; }; const preventDft = (event, enhance = false) => { event.cancelable && event.preventDefault(); enhance && event.stopPropagation(); }; const isMobi = ('ontouchstart' in document.documentElement); const events = isMobi ? ['touchstart', 'touchmove', 'touchend', 'touchcancel'] : ['mousedown', 'mousemove', 'mouseup', 'mouseleave']; const icons = { font: { succ: `<i class="${prefix}icon-check-o"></i>`, error: `<i class="${prefix}icon-close-o"></i>`, warn: `<i class="${prefix}icon-warn-o"></i>`, info: `<i class="${prefix}icon-info-o"></i>`, issue: `<i class="${prefix}icon-issue-o"></i>`, 'succ-t': `<i class="${prefix}icon-check-o-t"></i>`, 'error-t': `<i class="${prefix}icon-close-o-t"></i>`, 'warn-t': `<i class="${prefix}icon-warn-o-t"></i>`, 'info-t': `<i class="${prefix}icon-info-o-t"></i>`, 'issue-t': `<i class="${prefix}icon-issue-o-t"></i>`, 'succ-f': `<i class="${prefix}icon-check-o-f"></i>`, 'error-f': `<i class="${prefix}icon-close-o-f"></i>`, 'warn-f': `<i class="${prefix}icon-warn-o-f"></i>`, 'info-f': `<i class="${prefix}icon-info-o-f"></i>`, 'issue-f': `<i class="${prefix}icon-issue-o-f"></i>`, }, svg: { succ: `<svg class="${prefix}svg-succ" xmlns="http://www.w3.org/2000/svg" width="86.6986mm" height="86.6986mm" viewBox="0 0 86.6986 86.6986"><path class="${prefix}line ${prefix}bg" d="M7.238500000000002,43.3493A36.1108,36.1108 0,1,1 79.4601,43.3493A36.1108,36.1108 0,1,1 7.238500000000002,43.3493"></path><path class="${prefix}line ${prefix}out" d="M7.238500000000002,43.3493A36.1108,36.1108 0,1,1 79.4601,43.3493A36.1108,36.1108 0,1,1 7.238500000000002,43.3493"></path><path class="${prefix}line ${prefix}in-1" d="M26.316,42.859L37.9984,54.5414L60.3826,32.1572"></path></svg>`, error: `<svg class="${prefix}svg-error" xmlns="http://www.w3.org/2000/svg" width="86.6986mm" height="86.6986mm" viewBox="0 0 86.6986 86.6986"><path class="${prefix}line ${prefix}bg" d="M7.238500000000002,43.3493A36.1108,36.1108 0,1,1 79.4601,43.3493A36.1108,36.1108 0,1,1 7.238500000000002,43.3493"></path><path class="${prefix}line ${prefix}out" d="M7.238500000000002,43.3493A36.1108,36.1108 0,1,1 79.4601,43.3493A36.1108,36.1108 0,1,1 7.238500000000002,43.3493"></path><path class="${prefix}line ${prefix}in-1" d="M28.774,57.9246L57.9247,28.7739"></path><path class="${prefix}line ${prefix}in-2" d="M57.9246,57.9246L28.7739,28.7739"></path></svg>`, warn: `<svg class="${prefix}svg-warn" xmlns="http://www.w3.org/2000/svg" width="86.6986mm" height="86.6986mm" viewBox="0 0 86.6986 86.6986"><path class="${prefix}line ${prefix}bg" d="M43.4611 7.24c2.8081,0.0924 4.39,1.7 5.3045,3.1159l17.4543 29.9414 17.3445 29.7538c0.5448,1.0193 1.596,4.0544 0.1109,6.4168 -1.4849,2.3626 -3.6815,2.9155 -5.3768,2.992l-34.9082 0.0002 -34.6892 -0.0002c-1.1636,-0.0421 -4.3433,-0.6583 -5.6666,-3.1131 -1.3232,-2.4549 -0.7085,-4.6157 0.0723,-6.1078l17.454 -29.9417 17.3449 -29.7537c0.6185,-0.977 2.7471,-3.396 5.5554,-3.3036z"></path><path class="${prefix}line ${prefix}out" d="M43.4611 7.24c2.8081,0.0924 4.39,1.7 5.3045,3.1159l17.4543 29.9414 17.3445 29.7538c0.5448,1.0193 1.596,4.0544 0.1109,6.4168 -1.4849,2.3626 -3.6815,2.9155 -5.3768,2.992l-34.9082 0.0002 -34.6892 -0.0002c-1.1636,-0.0421 -4.3433,-0.6583 -5.6666,-3.1131 -1.3232,-2.4549 -0.7085,-4.6157 0.0723,-6.1078l17.454 -29.9417 17.3449 -29.7537c0.6185,-0.977 2.7471,-3.396 5.5554,-3.3036z"></path><path class="${prefix}line ${prefix}in-1" d="M43.3493,27.8713L43.3493,57.2858"></path><circle class="${prefix}circle ${prefix}in-2" cx="43.3492" cy="64.3337" r="2.1166"></circle></svg>`, info: `<svg class="${prefix}svg-info" xmlns="http://www.w3.org/2000/svg" width="86.6986mm" height="86.6986mm" viewBox="0 0 86.6986 86.6986"><path class="${prefix}line ${prefix}bg" d="M7.238500000000002,43.3493A36.1108,36.1108 0,1,1 79.4601,43.3493A36.1108,36.1108 0,1,1 7.238500000000002,43.3493"></path><path class="${prefix}line ${prefix}out" d="M7.238500000000002,43.3493A36.1108,36.1108 0,1,1 79.4601,43.3493A36.1108,36.1108 0,1,1 7.238500000000002,43.3493"></path><path class="${prefix}line ${prefix}in-1" d="M43.3493,65.0602L43.3493,30.9723"></path><circle class="${prefix}circle ${prefix}in-2" cx="43.3492" cy="23.5856" r="2.1166"></circle></svg>`, issue: `<svg class="${prefix}svg-issue" xmlns="http://www.w3.org/2000/svg" width="86.6986mm" height="86.6986mm" viewBox="0 0 86.6986 86.6986"><path class="${prefix}line ${prefix}bg" d="M7.238500000000002,43.3493A36.1108,36.1108 0,1,1 79.4601,43.3493A36.1108,36.1108 0,1,1 7.238500000000002,43.3493"></path><path class="${prefix}line ${prefix}out" d="M7.238500000000002,43.3493A36.1108,36.1108 0,1,1 79.4601,43.3493A36.1108,36.1108 0,1,1 7.238500000000002,43.3493"></path><path class="${prefix}line ${prefix}in-1" d="M32.3757 35.7255c-0.2203,-11.823 12.5789,-14.1087 18.4056,-9.4189 5.4663,4.3995 4.7426,12.804 -3.1088,17.9938 -3.0015,1.9839 -3.0003,3.8403 -3.0003,10.1707"></path><circle class="${prefix}circle ${prefix}in-2" cx="44.6612" cy="60.5502" r="2.1166"></circle></svg>`, } }; const getFullGap = () => getComputedVar(`--${prefix}g-full`); const propsMap = { x: { axis: 'x', position: 'left', overflow: 'overflowX', inner: 'clientWidth', outer: 'offsetWidth', scroll: 'scrollLeft', client: 'clientX', size: 'width', index: 4, offset: 'offsetLeft', gap: 'marginLeft' }, y: { axis: 'y', position: 'top', overflow: 'overflowY', inner: 'clientHeight', outer: 'offsetHeight', scroll: 'scrollTop', client: 'clientY', size: 'height', index: 5, offset: 'offsetTop', gap: 'marginTop' } }; const instance = { data: [], destroyFun: (item) => { if (!item) { return false; } if ((!item.ins.hasOwnProperty('destroyed') || !item.ins.destroyed) && item.ins.__proto__.destroy) { item.ins.destroy(); item.destTime = Date.now(); } }, initFun: (item) => { if (!item) { return false; } if ((!item.ins.hasOwnProperty('destroyed') || item.ins.destroyed) && item.ins.__proto__.init) { item.ins.init(); item.initTime = Date.now(); } }, push: function (ins, name = '', type = '') { if (!ins) { return false; } let obj = { name, ins, type, pushTime: Date.now() }; if (!this.data.some((k) => k.ins === ins)) { this.data.push(obj); } return this; }, find: function (name, type = '', destroyed = false) { if (!name) { return null; } let item; item = this.data.find((k) => { let flag = type ? k.type === type : true; return (k.ins.hasOwnProperty('destroyed')) ? (k.name === name && k.ins.destroyed === destroyed && flag) : (k.name === name && flag); }); return item ? item.ins : null; }, findAll: function (type = '', destroyed = false) { let items = []; if (!type) { items = this.data.filter((i) => i.ins.destroyed === destroyed); } else { items = this.data.filter((i) => { return (i.ins.hasOwnProperty('destroyed')) ? (i.type === type && i.ins.destroyed === destroyed) : (i.type === type); }); } return items.length > 0 ? items.map((i) => i.ins) : []; }, destroy: function (name, type) { if (!name) { return false; } let item = type ? (this.data.find((i) => i.name === name && i.type === type)) : (this.data.find((i) => i.name === name)); if (item) { this.destroyFun(item); } return this; }, destroyAll: function (type) { let items = !type ? this.data : this.data.filter((i) => i.type === type); items.forEach((i) => { this.destroyFun(i); }); return this; }, clear: function () { this.data.forEach((i) => { this.destroyFun(i