@veltra/desktop 1.8.2 → 1.8.4
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/action/action-group.js.map +1 -1
- package/dist/components/action/action-group.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/action/action.js.map +1 -1
- package/dist/components/auto-complete/auto-complete.js.map +1 -1
- package/dist/components/badge/badge.js.map +1 -1
- package/dist/components/batch-edit/batch-edit-form.js.map +1 -1
- package/dist/components/batch-edit/batch-edit-list.js.map +1 -1
- package/dist/components/batch-edit/batch-edit.js.map +1 -1
- package/dist/components/breadcrumb/breadcrumb.js.map +1 -1
- package/dist/components/button/button-group.js.map +1 -1
- package/dist/components/button/button.js.map +1 -1
- package/dist/components/calendar/calendar.js.map +1 -1
- package/dist/components/card/card-action.js.map +1 -1
- package/dist/components/card/card-content.js.map +1 -1
- package/dist/components/card/card-cover.js.map +1 -1
- package/dist/components/card/card-header.js.map +1 -1
- package/dist/components/card/card.js.map +1 -1
- package/dist/components/cascade/cascade-panel-item.js.map +1 -1
- package/dist/components/cascade/cascade.js +1 -0
- package/dist/components/cascade/cascade.js.map +1 -1
- package/dist/components/cascade/use-select.js +6 -2
- package/dist/components/cascade/use-select.js.map +1 -1
- package/dist/components/check-tag/check-tag.js.map +1 -1
- package/dist/components/checkbox/checkbox-button.js.map +1 -1
- package/dist/components/checkbox/checkbox.js.map +1 -1
- package/dist/components/checkbox-group/checkbox-group.js.map +1 -1
- package/dist/components/code-editor/code-editor.js.map +1 -1
- package/dist/components/collapse/collapse-item.js.map +1 -1
- package/dist/components/collapse/collapse.js.map +1 -1
- package/dist/components/condition-editor/components/condition-group.js.map +1 -1
- package/dist/components/condition-editor/components/condition-row.js.map +1 -1
- package/dist/components/condition-editor/condition-editor.js.map +1 -1
- package/dist/components/contextmenu/contextmenu-item.js.map +1 -1
- package/dist/components/contextmenu/contextmenu-panel.js.map +1 -1
- package/dist/components/contextmenu/contextmenu-sub.js.map +1 -1
- package/dist/components/contextmenu/contextmenu.js.map +1 -1
- package/dist/components/date-panel/date-panel.js.map +1 -1
- package/dist/components/date-panel/headers/day.js.map +1 -1
- package/dist/components/date-panel/headers/month.js.map +1 -1
- package/dist/components/date-panel/headers/year.js.map +1 -1
- package/dist/components/date-panel/panels/day.js.map +1 -1
- package/dist/components/date-panel/panels/month.js.map +1 -1
- package/dist/components/date-panel/panels/year.js.map +1 -1
- package/dist/components/date-picker/date-picker.js.map +1 -1
- package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
- package/dist/components/dialog/dialog.js.map +1 -1
- package/dist/components/drawer/drawer.js.map +1 -1
- package/dist/components/dropdown/dropdown.js.map +1 -1
- package/dist/components/dual-nav/dual-nav-app.js.map +1 -1
- package/dist/components/dual-nav/dual-nav.js.map +1 -1
- package/dist/components/empty/empty.js.map +1 -1
- package/dist/components/expression-editor/components/path-preview.js.map +1 -1
- package/dist/components/expression-editor/components/variable-picker.js.map +1 -1
- package/dist/components/expression-editor/expression-editor.js.map +1 -1
- package/dist/components/file-picker/file-picker.js.map +1 -1
- package/dist/components/file-viewer/file-viewer.js.map +1 -1
- package/dist/components/file-viewer/previewers/docx-previewer.js.map +1 -1
- package/dist/components/file-viewer/previewers/image-previewer.js.map +1 -1
- package/dist/components/file-viewer/previewers/ofd-previewer.js.map +1 -1
- package/dist/components/file-viewer/previewers/pdf-previewer.js.map +1 -1
- package/dist/components/file-viewer/previewers/pdf-viewport-scroll.js.map +1 -1
- package/dist/components/file-viewer/previewers/pdf-zoom-bridge.js.map +1 -1
- package/dist/components/file-viewer/previewers/sheet-previewer.js.map +1 -1
- package/dist/components/file-viewer/previewers/text-previewer.js.map +1 -1
- package/dist/components/file-viewer/previewers/video-previewer.js.map +1 -1
- package/dist/components/float-button/float-button.js.map +1 -1
- package/dist/components/form/form.js.map +1 -1
- package/dist/components/form/form.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/form-item/form-item.js.map +1 -1
- package/dist/components/form-item/form-item.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/gantt-chart/gantt-chart.js.map +1 -1
- package/dist/components/grid/grid-item.js.map +1 -1
- package/dist/components/grid/grid.js.map +1 -1
- package/dist/components/grid-input/grid-input.js.map +1 -1
- package/dist/components/group-input/group-input.js.map +1 -1
- package/dist/components/group-nav/group-nav-item.js.map +1 -1
- package/dist/components/group-nav/group-nav.js.map +1 -1
- package/dist/components/icon/icon.js.map +1 -1
- package/dist/components/image-cropper/image-cropper.js.map +1 -1
- package/dist/components/input/input.js.map +1 -1
- package/dist/components/input/input.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/kanban/kanban-column.js.map +1 -1
- package/dist/components/kanban/kanban.js.map +1 -1
- package/dist/components/kbd/kbd.js.map +1 -1
- package/dist/components/layout/layout-resizer.js.map +1 -1
- package/dist/components/layout/layout.js.map +1 -1
- package/dist/components/list/list-item.js.map +1 -1
- package/dist/components/list/list.js.map +1 -1
- package/dist/components/loading/loading.js.map +1 -1
- package/dist/components/message/message-box.js.map +1 -1
- package/dist/components/message/message.js.map +1 -1
- package/dist/components/message-confirm/message-confirm-box.js.map +1 -1
- package/dist/components/message-confirm/message-confirm.js.map +1 -1
- package/dist/components/multi-select/multi-select-option.js.map +1 -1
- package/dist/components/multi-select/multi-select.js.map +1 -1
- package/dist/components/multi-tree-select/multi-tree-select.js.map +1 -1
- package/dist/components/nav/nav-icon.js.map +1 -1
- package/dist/components/nav/nav-item-collapsed.js.map +1 -1
- package/dist/components/nav/nav-item.js.map +1 -1
- package/dist/components/nav/nav-sub-collapsed.js.map +1 -1
- package/dist/components/nav/nav-sub.js.map +1 -1
- package/dist/components/nav/nav.js.map +1 -1
- package/dist/components/notification/notification-box.js.map +1 -1
- package/dist/components/notification/notification.js.map +1 -1
- package/dist/components/number/number.js.map +1 -1
- package/dist/components/number-input/number-input.js.map +1 -1
- package/dist/components/number-range-input/number-range-input.js.map +1 -1
- package/dist/components/paginator/paginator.js.map +1 -1
- package/dist/components/palette/palette-alpha.js.map +1 -1
- package/dist/components/palette/palette-color-switch.js.map +1 -1
- package/dist/components/palette/palette-hue.js.map +1 -1
- package/dist/components/palette/palette-sv.js.map +1 -1
- package/dist/components/palette/palette.js.map +1 -1
- package/dist/components/password-input/password-input.js.map +1 -1
- package/dist/components/pop-confirm/pop-confirm.js.map +1 -1
- package/dist/components/progress/progress.js.map +1 -1
- package/dist/components/progress-nodes/progress-nodes.js.map +1 -1
- package/dist/components/radio/radio.js.map +1 -1
- package/dist/components/radio-group/radio-group.js.map +1 -1
- package/dist/components/rich-text-editor/image-node.js +53 -14
- package/dist/components/rich-text-editor/image-node.js.map +1 -1
- package/dist/components/rich-text-editor/rich-text-editor.js +9 -3
- package/dist/components/rich-text-editor/rich-text-editor.js.map +1 -1
- package/dist/components/rich-text-editor/style2.css +31 -0
- package/dist/components/rich-text-editor/toolbar.js.map +1 -1
- package/dist/components/rich-text-editor/use-image-resize.js +118 -0
- package/dist/components/rich-text-editor/use-image-resize.js.map +1 -0
- package/dist/components/scroll/scroll-bar.js.map +1 -1
- package/dist/components/scroll/scroll.js.map +1 -1
- package/dist/components/segment/segment.js.map +1 -1
- package/dist/components/select/select.js +9 -5
- package/dist/components/select/select.js.map +1 -1
- package/dist/components/slider/slider-thumb.js.map +1 -1
- package/dist/components/slider/slider.js.map +1 -1
- package/dist/components/steps/steps.js.map +1 -1
- package/dist/components/switch/switch.js.map +1 -1
- package/dist/components/table/table-body.js.map +1 -1
- package/dist/components/table/table-cell.js.map +1 -1
- package/dist/components/table/table-foot.js.map +1 -1
- package/dist/components/table/table-head.js.map +1 -1
- package/dist/components/table/table-row.js.map +1 -1
- package/dist/components/table/table.js.map +1 -1
- package/dist/components/table-editor/table-editor.js.map +1 -1
- package/dist/components/tabs/tabs-horizontal.js.map +1 -1
- package/dist/components/tabs/tabs-vertical.js.map +1 -1
- package/dist/components/tabs/tabs.js.map +1 -1
- package/dist/components/tag/tag.js.map +1 -1
- package/dist/components/text/text.js.map +1 -1
- package/dist/components/textarea/textarea.js.map +1 -1
- package/dist/components/theme/theme.js.map +1 -1
- package/dist/components/tip/tip.js.map +1 -1
- package/dist/components/tree/tree-node.js.map +1 -1
- package/dist/components/tree/tree.js.map +1 -1
- package/dist/components/tree-select/tree-select.js +19 -10
- package/dist/components/tree-select/tree-select.js.map +1 -1
- package/dist/components/watermark/watermark.js.map +1 -1
- package/dist/types/cascade.d.ts +5 -0
- package/dist/types/select.d.ts +8 -2
- package/dist/types/tree-select.d.ts +8 -2
- package/package.json +18 -18
- package/src/components/batch-edit/__test__/batch-edit.test.ts +1 -1
- package/src/components/button/__test__/button.test.ts +1 -1
- package/src/components/cascade/__test__/cascade.test.ts +26 -1
- package/src/components/cascade/use-select.ts +5 -5
- package/src/components/collapse/__test__/collapse.test.ts +1 -1
- package/src/components/condition-editor/__test__/condition-editor.test.ts +1 -1
- package/src/components/contextmenu/__test__/contextmenu.test.ts +1 -1
- package/src/components/date-picker/__test__/date-picker.test.ts +1 -1
- package/src/components/date-range-picker/__test__/date-range-picker.test.ts +1 -1
- package/src/components/drawer/__test__/drawer.test.ts +1 -1
- package/src/components/expression-editor/__test__/chip.test.ts +1 -1
- package/src/components/expression-editor/__test__/editor.test.ts +1 -1
- package/src/components/expression-editor/__test__/expression-editor.test.ts +1 -1
- package/src/components/expression-editor/__test__/mention.test.ts +1 -1
- package/src/components/expression-editor/__test__/model.test.ts +1 -1
- package/src/components/file-viewer/__test__/helper.test.ts +1 -1
- package/src/components/form/__test__/form.test.ts +1 -1
- package/src/components/form/__test__/is-field-modified.test.ts +1 -1
- package/src/components/form-item/__test__/form-item.test.ts +1 -1
- package/src/components/image-cropper/__test__/draw-crop.test.ts +1 -1
- package/src/components/image-cropper/__test__/image-cropper.test.ts +1 -1
- package/src/components/image-cropper/__test__/use-transform.test.ts +1 -1
- package/src/components/kanban/__test__/kanban.test.ts +1 -1
- package/src/components/message-confirm/__test__/message-confirm.test.ts +1 -1
- package/src/components/multi-tree-select/__test__/multi-tree-select.test.ts +1 -1
- package/src/components/number-input/__test__/number-input.test.ts +1 -1
- package/src/components/number-range-input/__test__/number-range-input.test.ts +1 -1
- package/src/components/palette/__test__/color-transform.test.ts +1 -1
- package/src/components/palette/__test__/palette.test.ts +1 -1
- package/src/components/password-input/__test__/password-input.test.ts +1 -1
- package/src/components/radio-group/__test__/radio-group.test.ts +1 -1
- package/src/components/rich-text-editor/__test__/image-node.test.ts +140 -0
- package/src/components/rich-text-editor/image-node.ts +84 -15
- package/src/components/rich-text-editor/rich-text-editor.vue +15 -4
- package/src/components/rich-text-editor/style.scss +35 -0
- package/src/components/rich-text-editor/use-image-resize.ts +168 -0
- package/src/components/segment/__test__/segment.test.ts +1 -1
- package/src/components/select/__test__/select.test.ts +68 -1
- package/src/components/select/select.vue +15 -5
- package/src/components/table/__test__/col-width.test.ts +1 -1
- package/src/components/table/__test__/column-style.test.ts +1 -1
- package/src/components/table-editor/__test__/table-editor.test.ts +1 -1
- package/src/components/tree-select/__test__/tree-select.test.ts +50 -1
- package/src/components/tree-select/tree-select.vue +28 -11
- package/src/types/cascade.ts +5 -0
- package/src/types/select.ts +8 -2
- package/src/types/tree-select.ts +9 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input.vue_vue_type_script_setup_true_lang.js","names":["$attrs","$slots"],"sources":["../../../src/components/input/input.vue"],"sourcesContent":["<template>\n <div\n v-if=\"!readonly\"\n v-bind=\"$attrs\"\n :class=\"inputClass\"\n @mouseenter=\"handleMouseEnter\"\n @mouseleave=\"handleMouseLeave\"\n >\n <span v-if=\"$slots.prefix || prefix\" :class=\"prefixClass\" @click=\"handlePrefixClick\">\n {{ prefix }}\n <slot name=\"prefix\"></slot>\n </span>\n\n <input\n :class=\"cls.e('native')\"\n :placeholder=\"props.placeholder\"\n type=\"text\"\n :value=\"model\"\n @input=\"handleInput\"\n @change=\"handleChange\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n @compositionstart=\"handleCompositionStart\"\n @compositionend=\"handleCompositionEnd\"\n autocomplete=\"off\"\n ref=\"el\"\n :disabled=\"disabled\"\n :readonly=\"nativeReadonly\"\n />\n\n <span :class=\"suffixClass\" v-if=\"hasSuffix\">\n <Transition name=\"zoom-in\" mode=\"out-in\">\n <UIcon\n v-if=\"showClear\"\n :class=\"cls.e('clear')\"\n title=\"清除\"\n @click.stop=\"clearModelValue\"\n key=\"clear\"\n >\n <Close />\n </UIcon>\n\n <span v-else :class=\"cls.e('suffix-content')\" @click=\"handleSuffixClick\" key=\"suffix\">\n {{ suffix }}\n <slot name=\"suffix\"></slot>\n </span>\n </Transition>\n </span>\n </div>\n\n <template v-else>\n {{ generateModel || FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"tsx\" setup>\nimport { useFocus, useFormFallbackProps } from '@veltra/compositions'\nimport { Close } from '@veltra/icons/normal'\nimport { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed, getCurrentInstance, ref, shallowRef, nextTick } from 'vue'\n\nimport type { InputEmits, InputProps, _InputExposed } from '../../types'\nimport { UIcon } from '../icon'\n\ndefineOptions({ name: 'UInput', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<InputProps>(), {\n placeholder: '请输入',\n clearable: true,\n disabled: undefined,\n readonly: undefined\n})\n\nconst emit = defineEmits<InputEmits>()\n\nconst model = defineModel<string>()\n\nconst inst = getCurrentInstance()\n\nconst cls = bem('input')\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props])\n\nconst { focus, handleBlur, handleFocus } = useFocus((focused) => {\n if (focused) {\n emit('focus')\n } else {\n emit('blur')\n }\n})\n\nconst inputClass = computed(() => {\n return [\n cls.b,\n cls.m(size.value),\n bem.is('disabled', disabled.value),\n bem.is('readonly', readonly.value),\n bem.is('focus', focus.value)\n ]\n})\n\nconst prefixClass = [cls.e('prefix'), bem.is('clickable', !!inst?.vnode.props?.['onPrefix:click'])]\n\nconst suffixClass = [cls.e('suffix'), bem.is('clickable', !!inst?.vnode.props?.['onSuffix:click'])]\n\nlet isComposing = false\n\nfunction handleCompositionStart() {\n isComposing = true\n}\n\nfunction handleCompositionEnd(e: Event) {\n isComposing = false\n handleInput(e)\n}\n\nconst handleInput = (e: Event) => {\n if (isComposing) return\n\n const inputVal = (e.target as HTMLInputElement).value\n emit('native:input', e)\n\n const valid = props.pattern?.test(inputVal) ?? true\n\n if (!valid) return\n model.value = inputVal\n}\n\nconst handlePrefixClick = () => {\n emit('prefix:click', model.value)\n}\n\nconst handleSuffixClick = () => {\n emit('suffix:click', model.value)\n}\n\nconst clearModelValue = () => {\n model.value = ''\n emit('clear')\n}\n\nconst hovered = ref(false)\nconst handleMouseEnter = () => {\n hovered.value = true\n}\n\nconst handleMouseLeave = () => {\n hovered.value = false\n}\n\nconst showClear = computed(() => {\n return props.clearable && !disabled.value && !!model.value && hovered.value\n})\n\nconst hasSuffixContent = computed(() => {\n return !!inst?.slots.suffix || !!props.suffix\n})\n\nconst hasSuffix = computed(() => {\n return hasSuffixContent.value || showClear.value\n})\n\nconst handleChange = (e: Event) => {\n const target = e.target as HTMLInputElement\n\n const valid = props.pattern?.test(target.value) ?? true\n\n if (valid) {\n emit('change', target.value)\n } else {\n nextTick(() => {\n target.value = model.value ?? ''\n })\n }\n}\n\nconst el = shallowRef<HTMLInputElement>()\n\nconst generateModel = computed(() => {\n if (!model.value) return ''\n\n return `${props.prefix ?? ''}${model.value}${props.suffix ?? ''}`\n})\n\ndefineExpose<_InputExposed>({ el })\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmEA,MAAM,QAAQ;EAOd,MAAM,OAAO;EAEb,MAAM,
|
|
1
|
+
{"version":3,"file":"input.vue_vue_type_script_setup_true_lang.js","names":["$attrs","$slots","_useModel","_unref","_openBlock","_createElementBlock","_mergeProps","_normalizeClass","_createTextVNode","_toDisplayString","_renderSlot","_createCommentVNode","_createElementVNode","_createVNode","_Transition","_withCtx","_createBlock","UIcon","_withModifiers","_Fragment"],"sources":["../../../src/components/input/input.vue"],"sourcesContent":["<template>\n <div\n v-if=\"!readonly\"\n v-bind=\"$attrs\"\n :class=\"inputClass\"\n @mouseenter=\"handleMouseEnter\"\n @mouseleave=\"handleMouseLeave\"\n >\n <span v-if=\"$slots.prefix || prefix\" :class=\"prefixClass\" @click=\"handlePrefixClick\">\n {{ prefix }}\n <slot name=\"prefix\"></slot>\n </span>\n\n <input\n :class=\"cls.e('native')\"\n :placeholder=\"props.placeholder\"\n type=\"text\"\n :value=\"model\"\n @input=\"handleInput\"\n @change=\"handleChange\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n @compositionstart=\"handleCompositionStart\"\n @compositionend=\"handleCompositionEnd\"\n autocomplete=\"off\"\n ref=\"el\"\n :disabled=\"disabled\"\n :readonly=\"nativeReadonly\"\n />\n\n <span :class=\"suffixClass\" v-if=\"hasSuffix\">\n <Transition name=\"zoom-in\" mode=\"out-in\">\n <UIcon\n v-if=\"showClear\"\n :class=\"cls.e('clear')\"\n title=\"清除\"\n @click.stop=\"clearModelValue\"\n key=\"clear\"\n >\n <Close />\n </UIcon>\n\n <span v-else :class=\"cls.e('suffix-content')\" @click=\"handleSuffixClick\" key=\"suffix\">\n {{ suffix }}\n <slot name=\"suffix\"></slot>\n </span>\n </Transition>\n </span>\n </div>\n\n <template v-else>\n {{ generateModel || FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"tsx\" setup>\nimport { useFocus, useFormFallbackProps } from '@veltra/compositions'\nimport { Close } from '@veltra/icons/normal'\nimport { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed, getCurrentInstance, ref, shallowRef, nextTick } from 'vue'\n\nimport type { InputEmits, InputProps, _InputExposed } from '../../types'\nimport { UIcon } from '../icon'\n\ndefineOptions({ name: 'UInput', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<InputProps>(), {\n placeholder: '请输入',\n clearable: true,\n disabled: undefined,\n readonly: undefined\n})\n\nconst emit = defineEmits<InputEmits>()\n\nconst model = defineModel<string>()\n\nconst inst = getCurrentInstance()\n\nconst cls = bem('input')\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props])\n\nconst { focus, handleBlur, handleFocus } = useFocus((focused) => {\n if (focused) {\n emit('focus')\n } else {\n emit('blur')\n }\n})\n\nconst inputClass = computed(() => {\n return [\n cls.b,\n cls.m(size.value),\n bem.is('disabled', disabled.value),\n bem.is('readonly', readonly.value),\n bem.is('focus', focus.value)\n ]\n})\n\nconst prefixClass = [cls.e('prefix'), bem.is('clickable', !!inst?.vnode.props?.['onPrefix:click'])]\n\nconst suffixClass = [cls.e('suffix'), bem.is('clickable', !!inst?.vnode.props?.['onSuffix:click'])]\n\nlet isComposing = false\n\nfunction handleCompositionStart() {\n isComposing = true\n}\n\nfunction handleCompositionEnd(e: Event) {\n isComposing = false\n handleInput(e)\n}\n\nconst handleInput = (e: Event) => {\n if (isComposing) return\n\n const inputVal = (e.target as HTMLInputElement).value\n emit('native:input', e)\n\n const valid = props.pattern?.test(inputVal) ?? true\n\n if (!valid) return\n model.value = inputVal\n}\n\nconst handlePrefixClick = () => {\n emit('prefix:click', model.value)\n}\n\nconst handleSuffixClick = () => {\n emit('suffix:click', model.value)\n}\n\nconst clearModelValue = () => {\n model.value = ''\n emit('clear')\n}\n\nconst hovered = ref(false)\nconst handleMouseEnter = () => {\n hovered.value = true\n}\n\nconst handleMouseLeave = () => {\n hovered.value = false\n}\n\nconst showClear = computed(() => {\n return props.clearable && !disabled.value && !!model.value && hovered.value\n})\n\nconst hasSuffixContent = computed(() => {\n return !!inst?.slots.suffix || !!props.suffix\n})\n\nconst hasSuffix = computed(() => {\n return hasSuffixContent.value || showClear.value\n})\n\nconst handleChange = (e: Event) => {\n const target = e.target as HTMLInputElement\n\n const valid = props.pattern?.test(target.value) ?? true\n\n if (valid) {\n emit('change', target.value)\n } else {\n nextTick(() => {\n target.value = model.value ?? ''\n })\n }\n}\n\nconst el = shallowRef<HTMLInputElement>()\n\nconst generateModel = computed(() => {\n if (!model.value) return ''\n\n return `${props.prefix ?? ''}${model.value}${props.suffix ?? ''}`\n})\n\ndefineExpose<_InputExposed>({ el })\n</script>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kanban-column.js","names":[],"sources":["../../../src/components/kanban/kanban-column.vue"],"sourcesContent":["<template>\n <div :class=\"cls.e('column')\">\n <div :class=\"cls.e('column-header')\">\n <slot name=\"header\" :column=\"column\" :count=\"values.length\">\n <span :class=\"cls.e('column-title')\">{{ title }}</span>\n <span v-if=\"countable\" :class=\"cls.e('column-count')\">{{ values.length }}</span>\n </slot>\n </div>\n\n <div ref=\"parentRef\" :class=\"cls.e('cards')\">\n <div v-for=\"(card, index) of values\" :key=\"card[cardKey]\" :class=\"cls.e('card')\">\n <span :class=\"cls.e('card-handle')\">≡</span>\n <div :class=\"cls.e('card-body')\">\n <slot name=\"card\" :card=\"card\" :column=\"column\" :index=\"index\">\n {{ card[titleKey] ?? card[cardKey] }}\n </slot>\n </div>\n </div>\n\n <div v-if=\"!values.length\" :class=\"cls.e('empty')\">\n <slot name=\"empty\" :column=\"column\">{{ placeholder }}</slot>\n </div>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { animations, useDnD, type VueParentConfig } from '@veltra/compositions'\nimport { computed, inject, watch } from 'vue'\n\nimport type { KanbanColumnItem, KanbanSlots } from '../../types'\nimport { KanbanDIKey } from './di'\n\ndefineOptions({ name: 'UKanbanColumn' })\n\ndefineSlots<KanbanSlots>()\n\nconst props = defineProps<{ column: KanbanColumnItem }>()\n\nconst ctx = inject(KanbanDIKey)!\n\nconst cls = ctx.cls\n\nconst titleKey = computed(() => ctx.kanbanProps.titleKey ?? 'title')\nconst cardKey = computed(() => ctx.kanbanProps.cardKey ?? 'id')\nconst countable = computed(() => ctx.kanbanProps.countable !== false)\nconst placeholder = computed(() => ctx.kanbanProps.placeholder ?? '暂无内容')\n\nconst title = computed(() => props.column[titleKey.value])\n\nfunction makeConfig(): VueParentConfig<Record<string, any>> {\n return {\n group: 'u-kanban',\n dragHandle: `.${cls.e('card-handle')}`,\n draggable: (el) => el.classList.contains(cls.e('card')),\n draggingClass: 'is-dragging',\n dropZoneClass: 'is-dropzone',\n disabled: ctx.kanbanProps.disabled,\n // 排序/转移数据已由 onReorder 写回,这里只负责对外发 change 通知\n onSort: () => ctx.notifyChange(),\n onTransfer: () => ctx.notifyChange(),\n plugins: [animations()]\n }\n}\n\nconst { parentRef, values, updateConfig } = useDnD<Record<string, any>>({\n values: () => props.column.items,\n onReorder: (items) => ctx.reorderColumn(props.column.key, items),\n ...makeConfig()\n})\n\n// updateConfig 是整体替换配置,须传完整配置而非仅 disabled\nwatch(\n () => ctx.kanbanProps.disabled,\n () => updateConfig(makeConfig())\n)\n</script>\n"],"mappings":";;;;;;;;;EAqCA,MAAM,QAAQ;EAEd,MAAM,MAAM,OAAO,WAAW;EAE9B,MAAM,MAAM,IAAI;EAEhB,MAAM,WAAW,eAAe,IAAI,YAAY,YAAY,OAAO;EACnE,MAAM,UAAU,eAAe,IAAI,YAAY,WAAW,IAAI;EAC9D,MAAM,YAAY,eAAe,IAAI,YAAY,cAAc,KAAK;EACpE,MAAM,cAAc,eAAe,IAAI,YAAY,eAAe,MAAM;EAExE,MAAM,QAAQ,eAAe,MAAM,OAAO,SAAS,MAAM;EAEzD,SAAS,aAAmD;GAC1D,OAAO;IACL,OAAO;IACP,YAAY,IAAI,IAAI,EAAE,aAAa;IACnC,YAAY,OAAO,GAAG,UAAU,SAAS,IAAI,EAAE,MAAM,CAAC;IACtD,eAAe;IACf,eAAe;IACf,UAAU,IAAI,YAAY;IAE1B,cAAc,IAAI,aAAa;IAC/B,kBAAkB,IAAI,aAAa;IACnC,SAAS,CAAC,WAAW,CAAC;GACxB;EACF;EAEA,MAAM,EAAE,WAAW,QAAQ,iBAAiB,OAA4B;GACtE,cAAc,MAAM,OAAO;GAC3B,YAAY,UAAU,IAAI,cAAc,MAAM,OAAO,KAAK,KAAK;GAC/D,GAAG,WAAW;EAChB,CAAC;EAGD,YACQ,IAAI,YAAY,gBAChB,aAAa,WAAW,CAAC,CACjC;;GA1EE,
|
|
1
|
+
{"version":3,"file":"kanban-column.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_renderSlot","_toDisplayString","_createCommentVNode","_Fragment","_renderList","_createTextVNode"],"sources":["../../../src/components/kanban/kanban-column.vue"],"sourcesContent":["<template>\n <div :class=\"cls.e('column')\">\n <div :class=\"cls.e('column-header')\">\n <slot name=\"header\" :column=\"column\" :count=\"values.length\">\n <span :class=\"cls.e('column-title')\">{{ title }}</span>\n <span v-if=\"countable\" :class=\"cls.e('column-count')\">{{ values.length }}</span>\n </slot>\n </div>\n\n <div ref=\"parentRef\" :class=\"cls.e('cards')\">\n <div v-for=\"(card, index) of values\" :key=\"card[cardKey]\" :class=\"cls.e('card')\">\n <span :class=\"cls.e('card-handle')\">≡</span>\n <div :class=\"cls.e('card-body')\">\n <slot name=\"card\" :card=\"card\" :column=\"column\" :index=\"index\">\n {{ card[titleKey] ?? card[cardKey] }}\n </slot>\n </div>\n </div>\n\n <div v-if=\"!values.length\" :class=\"cls.e('empty')\">\n <slot name=\"empty\" :column=\"column\">{{ placeholder }}</slot>\n </div>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { animations, useDnD, type VueParentConfig } from '@veltra/compositions'\nimport { computed, inject, watch } from 'vue'\n\nimport type { KanbanColumnItem, KanbanSlots } from '../../types'\nimport { KanbanDIKey } from './di'\n\ndefineOptions({ name: 'UKanbanColumn' })\n\ndefineSlots<KanbanSlots>()\n\nconst props = defineProps<{ column: KanbanColumnItem }>()\n\nconst ctx = inject(KanbanDIKey)!\n\nconst cls = ctx.cls\n\nconst titleKey = computed(() => ctx.kanbanProps.titleKey ?? 'title')\nconst cardKey = computed(() => ctx.kanbanProps.cardKey ?? 'id')\nconst countable = computed(() => ctx.kanbanProps.countable !== false)\nconst placeholder = computed(() => ctx.kanbanProps.placeholder ?? '暂无内容')\n\nconst title = computed(() => props.column[titleKey.value])\n\nfunction makeConfig(): VueParentConfig<Record<string, any>> {\n return {\n group: 'u-kanban',\n dragHandle: `.${cls.e('card-handle')}`,\n draggable: (el) => el.classList.contains(cls.e('card')),\n draggingClass: 'is-dragging',\n dropZoneClass: 'is-dropzone',\n disabled: ctx.kanbanProps.disabled,\n // 排序/转移数据已由 onReorder 写回,这里只负责对外发 change 通知\n onSort: () => ctx.notifyChange(),\n onTransfer: () => ctx.notifyChange(),\n plugins: [animations()]\n }\n}\n\nconst { parentRef, values, updateConfig } = useDnD<Record<string, any>>({\n values: () => props.column.items,\n onReorder: (items) => ctx.reorderColumn(props.column.key, items),\n ...makeConfig()\n})\n\n// updateConfig 是整体替换配置,须传完整配置而非仅 disabled\nwatch(\n () => ctx.kanbanProps.disabled,\n () => updateConfig(makeConfig())\n)\n</script>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kanban.js","names":["$attrs"],"sources":["../../../src/components/kanban/kanban.vue"],"sourcesContent":["<template>\n <div v-bind=\"$attrs\" :class=\"[cls.b, bem.is('disabled', disabled)]\">\n <KanbanColumn v-for=\"column of localColumns\" :key=\"column.key\" :column=\"column\">\n <template #header=\"{ column: col, count }\">\n <slot name=\"header\" :column=\"col\" :count=\"count\" />\n </template>\n <template #card=\"{ card, column: col, index }\">\n <slot name=\"card\" :card=\"card\" :column=\"col\" :index=\"index\" />\n </template>\n <template #empty=\"{ column: col }\">\n <slot name=\"empty\" :column=\"col\" />\n </template>\n </KanbanColumn>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem } from '@veltra/utils'\nimport { provide, ref, watch } from 'vue'\n\nimport type { KanbanColumnItem, KanbanEmits, KanbanProps, KanbanSlots } from '../../types'\nimport { KanbanDIKey, type KanbanContext } from './di'\nimport KanbanColumn from './kanban-column.vue'\n\ndefineOptions({ name: 'UKanban', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<KanbanProps>(), {\n cardKey: 'id',\n titleKey: 'title',\n disabled: false,\n countable: true,\n placeholder: '暂无内容'\n})\n\nconst emit = defineEmits<KanbanEmits>()\ndefineSlots<KanbanSlots>()\n\nconst cls = bem('kanban')\n\n// 拖拽写回的本地数据源:props 拷贝一份避免原地改父级数据,\n// 拖拽结果经 update:columns 交给父级决定是否受控回写\nconst localColumns = ref<KanbanColumnItem[]>([])\n\nwatch(\n () => props.columns,\n (columns) => {\n localColumns.value = (columns ?? []).map((column) => ({ ...column, items: [...column.items] }))\n },\n { immediate: true }\n)\n\nfunction snapshot(): KanbanColumnItem[] {\n return localColumns.value.map((column) => ({ ...column, items: [...column.items] }))\n}\n\nfunction reorderColumn(columnKey: string, items: Record<string, any>[]) {\n localColumns.value = localColumns.value.map((column) =>\n column.key === columnKey ? { ...column, items } : column\n )\n emit('update:columns', snapshot())\n}\n\n// 一次拖拽可能同步触发多个回调(跨列转移在源列与目标列各触发一次 onTransfer),\n// microtask 内合并保证一次操作只 emit 一次 change\nlet changePending = false\nfunction notifyChange() {\n if (changePending) return\n changePending = true\n queueMicrotask(() => {\n changePending = false\n emit('change', snapshot())\n })\n}\n\nprovide(KanbanDIKey, {\n kanbanProps: props,\n cls,\n reorderColumn,\n notifyChange\n} satisfies KanbanContext)\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;EA0BA,MAAM,QAAQ;EAQd,MAAM,OAAO;EAGb,MAAM,MAAM,IAAI,QAAQ;EAIxB,MAAM,eAAe,IAAwB,CAAC,CAAC;EAE/C,YACQ,MAAM,UACX,YAAY;GACX,aAAa,SAAS,WAAW,CAAC,EAAA,CAAG,KAAK,YAAY;IAAE,GAAG;IAAQ,OAAO,CAAC,GAAG,OAAO,KAAK;GAAE,EAAE;EAChG,GACA,EAAE,WAAW,KAAK,CACpB;EAEA,SAAS,WAA+B;GACtC,OAAO,aAAa,MAAM,KAAK,YAAY;IAAE,GAAG;IAAQ,OAAO,CAAC,GAAG,OAAO,KAAK;GAAE,EAAE;EACrF;EAEA,SAAS,cAAc,WAAmB,OAA8B;GACtE,aAAa,QAAQ,aAAa,MAAM,KAAK,WAC3C,OAAO,QAAQ,YAAY;IAAE,GAAG;IAAQ;GAAM,IAAI,MACpD;GACA,KAAK,kBAAkB,SAAS,CAAC;EACnC;EAIA,IAAI,gBAAgB;EACpB,SAAS,eAAe;GACtB,IAAI,eAAe;GACnB,gBAAgB;GAChB,qBAAqB;IACnB,gBAAgB;IAChB,KAAK,UAAU,SAAS,CAAC;GAC3B,CAAC;EACH;EAEA,QAAQ,aAAa;GACnB,aAAa;GACb;GACA;GACA;EACF,CAAyB;;GA9EvB,
|
|
1
|
+
{"version":3,"file":"kanban.js","names":["$attrs","_openBlock","_createElementBlock","_mergeProps","_unref","_Fragment","_renderList","_createBlock","KanbanColumn","_withCtx","_renderSlot"],"sources":["../../../src/components/kanban/kanban.vue"],"sourcesContent":["<template>\n <div v-bind=\"$attrs\" :class=\"[cls.b, bem.is('disabled', disabled)]\">\n <KanbanColumn v-for=\"column of localColumns\" :key=\"column.key\" :column=\"column\">\n <template #header=\"{ column: col, count }\">\n <slot name=\"header\" :column=\"col\" :count=\"count\" />\n </template>\n <template #card=\"{ card, column: col, index }\">\n <slot name=\"card\" :card=\"card\" :column=\"col\" :index=\"index\" />\n </template>\n <template #empty=\"{ column: col }\">\n <slot name=\"empty\" :column=\"col\" />\n </template>\n </KanbanColumn>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem } from '@veltra/utils'\nimport { provide, ref, watch } from 'vue'\n\nimport type { KanbanColumnItem, KanbanEmits, KanbanProps, KanbanSlots } from '../../types'\nimport { KanbanDIKey, type KanbanContext } from './di'\nimport KanbanColumn from './kanban-column.vue'\n\ndefineOptions({ name: 'UKanban', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<KanbanProps>(), {\n cardKey: 'id',\n titleKey: 'title',\n disabled: false,\n countable: true,\n placeholder: '暂无内容'\n})\n\nconst emit = defineEmits<KanbanEmits>()\ndefineSlots<KanbanSlots>()\n\nconst cls = bem('kanban')\n\n// 拖拽写回的本地数据源:props 拷贝一份避免原地改父级数据,\n// 拖拽结果经 update:columns 交给父级决定是否受控回写\nconst localColumns = ref<KanbanColumnItem[]>([])\n\nwatch(\n () => props.columns,\n (columns) => {\n localColumns.value = (columns ?? []).map((column) => ({ ...column, items: [...column.items] }))\n },\n { immediate: true }\n)\n\nfunction snapshot(): KanbanColumnItem[] {\n return localColumns.value.map((column) => ({ ...column, items: [...column.items] }))\n}\n\nfunction reorderColumn(columnKey: string, items: Record<string, any>[]) {\n localColumns.value = localColumns.value.map((column) =>\n column.key === columnKey ? { ...column, items } : column\n )\n emit('update:columns', snapshot())\n}\n\n// 一次拖拽可能同步触发多个回调(跨列转移在源列与目标列各触发一次 onTransfer),\n// microtask 内合并保证一次操作只 emit 一次 change\nlet changePending = false\nfunction notifyChange() {\n if (changePending) return\n changePending = true\n queueMicrotask(() => {\n changePending = false\n emit('change', snapshot())\n })\n}\n\nprovide(KanbanDIKey, {\n kanbanProps: props,\n cls,\n reorderColumn,\n notifyChange\n} satisfies KanbanContext)\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;EA0BA,MAAM,QAAQ;EAQd,MAAM,OAAO;EAGb,MAAM,MAAM,IAAI,QAAQ;EAIxB,MAAM,eAAe,IAAwB,CAAC,CAAC;EAE/C,YACQ,MAAM,UACX,YAAY;GACX,aAAa,SAAS,WAAW,CAAC,EAAA,CAAG,KAAK,YAAY;IAAE,GAAG;IAAQ,OAAO,CAAC,GAAG,OAAO,KAAK;GAAE,EAAE;EAChG,GACA,EAAE,WAAW,KAAK,CACpB;EAEA,SAAS,WAA+B;GACtC,OAAO,aAAa,MAAM,KAAK,YAAY;IAAE,GAAG;IAAQ,OAAO,CAAC,GAAG,OAAO,KAAK;GAAE,EAAE;EACrF;EAEA,SAAS,cAAc,WAAmB,OAA8B;GACtE,aAAa,QAAQ,aAAa,MAAM,KAAK,WAC3C,OAAO,QAAQ,YAAY;IAAE,GAAG;IAAQ;GAAM,IAAI,MACpD;GACA,KAAK,kBAAkB,SAAS,CAAC;EACnC;EAIA,IAAI,gBAAgB;EACpB,SAAS,eAAe;GACtB,IAAI,eAAe;GACnB,gBAAgB;GAChB,qBAAqB;IACnB,gBAAgB;IAChB,KAAK,UAAU,SAAS,CAAC;GAC3B,CAAC;EACH;EAEA,QAAQ,aAAa;GACnB,aAAa;GACb;GACA;GACA;EACF,CAAyB;;GA9EvB,OAAAC,UAAA,GAAAC,mBAYM,OAZNC,WAAaH,KAYP,QAZa,EAAG,OAAK,CAAGI,MAAA,GAAA,CAAG,CAAC,GAAGA,MAAA,GAAA,CAAG,CAAC,GAAE,YAAa,QAAA,QAAQ,CAAA,EAAA,CAAA,GAC9D,EAAAH,UAAA,IAAA,GAAAC,mBAUeG,UAAA,MAAAC,WAVgB,aAAA,QAAV,WAAM;IAA3B,OAAAL,UAAA,GAAAM,YAUeC,aAAA;KAV+B,KAAK,OAAO;KAAc;;KAC3D,QAAMC,SACoC,EAAA,QADxB,KAAK,YAAK,CACrCC,WAAmD,KAAA,QAAA,UAAA;MAA9B,QAAQ;MAAa;;KAEjC,MAAID,SACiD,EAD7C,MAAI,QAAU,KAAK,YAAK,CACzCC,WAA8D,KAAA,QAAA,QAAA;MAArC;MAAO,QAAQ;MAAa;;KAE5C,OAAKD,SACqB,EAAA,QADT,UAAG,CAC7BC,WAAmC,KAAA,QAAA,SAAA,EAAf,QAAQ,IAAG,CAAA,CAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kbd.js","names":[],"sources":["../../../src/components/kbd/kbd.vue"],"sourcesContent":["<template>\n <kbd :class=\"cls.b\">\n <slot />\n </kbd>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem } from '@veltra/utils'\n\ndefineOptions({ name: 'UKbd' })\n\nconst cls = bem('kbd')\n</script>\n"],"mappings":";;;;;;;EAWA,MAAM,MAAM,IAAI,KAAK;;GAVnB,
|
|
1
|
+
{"version":3,"file":"kbd.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_renderSlot"],"sources":["../../../src/components/kbd/kbd.vue"],"sourcesContent":["<template>\n <kbd :class=\"cls.b\">\n <slot />\n </kbd>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem } from '@veltra/utils'\n\ndefineOptions({ name: 'UKbd' })\n\nconst cls = bem('kbd')\n</script>\n"],"mappings":";;;;;;;EAWA,MAAM,MAAM,IAAI,KAAK;;GAVnB,OAAAA,UAAA,GAAAC,mBAEM,OAAA,EAFA,OAAKC,eAAEC,MAAA,GAAA,CAAG,CAAC,CAAC,EAAA,GAChB,CAAAC,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout-resizer.js","names":[],"sources":["../../../src/components/layout/layout-resizer.vue"],"sourcesContent":["<template>\n <div\n :class=\"className\"\n :style=\"{ transform: `translate3d(${offsets.x}, ${offsets.y}, 0)` }\"\n ref=\"resizerRef\"\n >\n <u-icon :size=\"10\"> <Move /> </u-icon>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useDrag } from '@veltra/compositions'\nimport { Move } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed, inject, shallowReactive, shallowRef } from 'vue'\n\nimport { UIcon } from '../icon'\nimport { LayoutDIKey } from './di'\n\ndefineOptions({ name: 'ULayoutResizer' })\n\nconst props = defineProps<{\n /** 是否横向 */\n horizontal?: boolean\n /** 默认偏移量 */\n offset?: number\n}>()\n\nconst emit = defineEmits<{\n (e: 'resize', offset: number): void\n (e: 'resize-start'): void\n (e: 'resize-end'): void\n}>()\n\nconst { cls } = inject(LayoutDIKey)!\n\nconst className = computed(() => {\n return [cls.e('resizer'), bem.is('horizontal', props.horizontal)]\n})\n\nconst resizerRef = shallowRef<HTMLDivElement>()\n\nlet offset = props.offset ?? 0\nconst offsets = shallowReactive({\n x: props.horizontal ? '0' : offset + 'px',\n y: props.horizontal ? offset + 'px' : '0'\n})\nlet currentOffset = 0\nuseDrag({\n target: resizerRef,\n onDragStart() {\n currentOffset = offset\n emit('resize-start')\n },\n onDrag({ x, y }) {\n if (!props.horizontal) {\n offset = currentOffset + x\n offsets.x = offset + 'px'\n emit('resize', x)\n } else {\n offset = currentOffset + y\n offsets.y = offset + 'px'\n emit('resize', y)\n }\n },\n onDragEnd() {\n emit('resize-end')\n }\n})\n\ndefineExpose({\n update(_offset: number): void {\n offset = _offset\n if (!props.horizontal) {\n offsets.x = offset + 'px'\n } else {\n offsets.y = offset + 'px'\n }\n }\n})\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;EAqBA,MAAM,QAAQ;EAOd,MAAM,OAAO;EAMb,MAAM,EAAE,QAAQ,OAAO,WAAW;EAElC,MAAM,YAAY,eAAe;GAC/B,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,GAAG,cAAc,MAAM,UAAU,CAAC;EAClE,CAAC;EAED,MAAM,aAAa,WAA2B;EAE9C,IAAI,SAAS,MAAM,UAAU;EAC7B,MAAM,UAAU,gBAAgB;GAC9B,GAAG,MAAM,aAAa,MAAM,SAAS;GACrC,GAAG,MAAM,aAAa,SAAS,OAAO;EACxC,CAAC;EACD,IAAI,gBAAgB;EACpB,QAAQ;GACN,QAAQ;GACR,cAAc;IACZ,gBAAgB;IAChB,KAAK,cAAc;GACrB;GACA,OAAO,EAAE,GAAG,KAAK;IACf,IAAI,CAAC,MAAM,YAAY;KACrB,SAAS,gBAAgB;KACzB,QAAQ,IAAI,SAAS;KACrB,KAAK,UAAU,CAAC;IAClB,OAAO;KACL,SAAS,gBAAgB;KACzB,QAAQ,IAAI,SAAS;KACrB,KAAK,UAAU,CAAC;IAClB;GACF;GACA,YAAY;IACV,KAAK,YAAY;GACnB;EACF,CAAC;EAED,SAAa,EACX,OAAO,SAAuB;GAC5B,SAAS;GACT,IAAI,CAAC,MAAM,YACT,QAAQ,IAAI,SAAS;QAErB,QAAQ,IAAI,SAAS;EAEzB,EACF,CAAC;;GA9EC,
|
|
1
|
+
{"version":3,"file":"layout-resizer.js","names":["_openBlock","_createElementBlock","_normalizeClass","_normalizeStyle","_unref","_createVNode","UIcon","_withCtx"],"sources":["../../../src/components/layout/layout-resizer.vue"],"sourcesContent":["<template>\n <div\n :class=\"className\"\n :style=\"{ transform: `translate3d(${offsets.x}, ${offsets.y}, 0)` }\"\n ref=\"resizerRef\"\n >\n <u-icon :size=\"10\"> <Move /> </u-icon>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useDrag } from '@veltra/compositions'\nimport { Move } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed, inject, shallowReactive, shallowRef } from 'vue'\n\nimport { UIcon } from '../icon'\nimport { LayoutDIKey } from './di'\n\ndefineOptions({ name: 'ULayoutResizer' })\n\nconst props = defineProps<{\n /** 是否横向 */\n horizontal?: boolean\n /** 默认偏移量 */\n offset?: number\n}>()\n\nconst emit = defineEmits<{\n (e: 'resize', offset: number): void\n (e: 'resize-start'): void\n (e: 'resize-end'): void\n}>()\n\nconst { cls } = inject(LayoutDIKey)!\n\nconst className = computed(() => {\n return [cls.e('resizer'), bem.is('horizontal', props.horizontal)]\n})\n\nconst resizerRef = shallowRef<HTMLDivElement>()\n\nlet offset = props.offset ?? 0\nconst offsets = shallowReactive({\n x: props.horizontal ? '0' : offset + 'px',\n y: props.horizontal ? offset + 'px' : '0'\n})\nlet currentOffset = 0\nuseDrag({\n target: resizerRef,\n onDragStart() {\n currentOffset = offset\n emit('resize-start')\n },\n onDrag({ x, y }) {\n if (!props.horizontal) {\n offset = currentOffset + x\n offsets.x = offset + 'px'\n emit('resize', x)\n } else {\n offset = currentOffset + y\n offsets.y = offset + 'px'\n emit('resize', y)\n }\n },\n onDragEnd() {\n emit('resize-end')\n }\n})\n\ndefineExpose({\n update(_offset: number): void {\n offset = _offset\n if (!props.horizontal) {\n offsets.x = offset + 'px'\n } else {\n offsets.y = offset + 'px'\n }\n }\n})\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;EAqBA,MAAM,QAAQ;EAOd,MAAM,OAAO;EAMb,MAAM,EAAE,QAAQ,OAAO,WAAW;EAElC,MAAM,YAAY,eAAe;GAC/B,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,GAAG,cAAc,MAAM,UAAU,CAAC;EAClE,CAAC;EAED,MAAM,aAAa,WAA2B;EAE9C,IAAI,SAAS,MAAM,UAAU;EAC7B,MAAM,UAAU,gBAAgB;GAC9B,GAAG,MAAM,aAAa,MAAM,SAAS;GACrC,GAAG,MAAM,aAAa,SAAS,OAAO;EACxC,CAAC;EACD,IAAI,gBAAgB;EACpB,QAAQ;GACN,QAAQ;GACR,cAAc;IACZ,gBAAgB;IAChB,KAAK,cAAc;GACrB;GACA,OAAO,EAAE,GAAG,KAAK;IACf,IAAI,CAAC,MAAM,YAAY;KACrB,SAAS,gBAAgB;KACzB,QAAQ,IAAI,SAAS;KACrB,KAAK,UAAU,CAAC;IAClB,OAAO;KACL,SAAS,gBAAgB;KACzB,QAAQ,IAAI,SAAS;KACrB,KAAK,UAAU,CAAC;IAClB;GACF;GACA,YAAY;IACV,KAAK,YAAY;GACnB;EACF,CAAC;EAED,SAAa,EACX,OAAO,SAAuB;GAC5B,SAAS;GACT,IAAI,CAAC,MAAM,YACT,QAAQ,IAAI,SAAS;QAErB,QAAQ,IAAI,SAAS;EAEzB,EACF,CAAC;;GA9EC,OAAAA,UAAA,GAAAC,mBAMM,OAAA;IALH,OAAKC,eAAE,UAAA,KAAS;IAChB,OAAKC,eAAA,EAAA,WAAA,eAA8BC,MAAA,OAAA,CAAO,CAAC,EAAC,IAAKA,MAAA,OAAA,CAAO,CAAC,EAAC,MAAA,CAAA;IACvD,SAAA;IAAJ,KAAI;GAEJ,GAAA,CAAAC,YAAsCD,MAAAE,WAAA,GAAA,EAA7B,MAAM,GAAE,GAAA;IAAG,SAAAC,cAAQ,CAARF,YAAQD,MAAA,IAAA,CAAA,CAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.js","names":[],"sources":["../../../src/components/layout/layout.vue"],"sourcesContent":["<template>\n <component :is=\"tag\" :class=\"cls.b\" :style=\"style\" ref=\"containerRef\">\n <slot />\n\n <!-- 竖向调节 -->\n <ULayoutResizer\n v-for=\"(offset, index) of resizerOffsets\"\n :offset=\"offset\"\n :key=\"index\"\n ref=\"resizerRefs\"\n direction=\"vertical\"\n @resize=\"handleResize($event, index)\"\n @resize-start=\"handleStartResize(index)\"\n @resize-end=\"emit('resize-end', index)\"\n >\n </ULayoutResizer>\n\n <!-- 横向调节 -->\n <!-- <ULayoutResizer\n v-for=\"item in horizontalResizerList\"\n :key=\"item\"\n direction=\"horizontal\"\n /> -->\n </component>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useResizeObserver } from '@veltra/compositions'\nimport { bem, withUnit } from '@veltra/utils'\nimport {\n computed,\n shallowRef,\n type CSSProperties,\n provide,\n watchEffect,\n ref,\n watch,\n nextTick\n} from 'vue'\n\nimport type { LayoutEmits, LayoutProps } from '../../types'\nimport { LayoutDIKey } from './di'\nimport ULayoutResizer from './layout-resizer.vue'\n\ndefineOptions({ name: 'ULayout' })\n\nconst props = withDefaults(defineProps<LayoutProps>(), { tag: 'div' })\n\nconst emit = defineEmits<LayoutEmits>()\n\nconst cls = bem('layout')\n\nconst templateCols = ref<string[]>([])\n\nwatchEffect(() => {\n const { cols } = props\n if (!cols) {\n templateCols.value = []\n return\n }\n templateCols.value = typeof cols === 'string' ? cols.split(' ') : [...cols]\n})\n\nconst style = computed<CSSProperties>(() => {\n const { rows, gap, resizable } = props\n return {\n gridTemplateColumns: templateCols.value.join(' '),\n gridTemplateRows: rows ? (typeof rows === 'string' ? rows : rows.join(' ')) : '',\n columnGap: resizable ? '10px' : withUnit(gap, 'px')\n }\n})\n\nconst containerRef = shallowRef<HTMLElement>()\nconst resizerRefs = shallowRef<InstanceType<typeof ULayoutResizer>[]>([])\n\nconst resizerOffsets = ref<number[]>([])\n\nfunction getResizeOffsets() {\n const container = containerRef.value\n if (!props.resizable || !container || !props.cols) {\n return (resizerOffsets.value = [])\n }\n\n resizerOffsets.value = templateCols.value.slice(0, -1).map((_, index) => {\n const dom = container.children[index] as HTMLElement\n if (!dom) return 0\n return dom.offsetLeft + dom.offsetWidth\n })\n}\n\nwatch([() => props.resizable, containerRef, () => props.cols], () => {\n nextTick(() => {\n syncResizers()\n })\n})\n\nuseResizeObserver({\n targets: containerRef,\n onResize() {\n syncResizers()\n }\n})\n\n/** 重新测量各列边界并同步所有拖拽手柄位置(容器尺寸或 cols 程序化变化后调用) */\nfunction syncResizers() {\n getResizeOffsets()\n resizerRefs.value.forEach((r, i) => {\n r.update(resizerOffsets.value![i]!)\n })\n}\n\n// const horizontalResizerList = []\n\n// const resizing = shallowRef(false)\n\nlet prevSize = 0\nlet nextSize = 0\nconst handleStartResize = (index: number) => {\n const container = containerRef.value\n if (!container) return\n\n // 拖拽前把相邻两列按实际渲染宽度固定成 px,\n // 这样拖拽时两列等量增减、容器整体宽度保持不变。\n const prevDom = container.children[index] as HTMLElement | undefined\n const nextDom = container.children[index + 1] as HTMLElement | undefined\n prevSize = prevDom ? prevDom.getBoundingClientRect().width : 0\n nextSize = nextDom ? nextDom.getBoundingClientRect().width : 0\n emit('resize-start', index)\n}\nconst handleResize = (offset: number, index: number) => {\n // 钳位到 [colMin-prevSize, nextSize-colMin],避免轨道尺寸出现负值或小于列最小宽度——\n // 一旦 grid-template-columns 中带负值,整条声明会被浏览器丢弃。\n const minPrev = props.colMinSizes?.[index] ?? 0\n const minNext = props.colMinSizes?.[index + 1] ?? 0\n const clamped = Math.max(minPrev - prevSize, Math.min(nextSize - minNext, offset))\n templateCols.value[index] = `${prevSize + clamped}px`\n templateCols.value[index + 1] = `${nextSize - clamped}px`\n}\n\nprovide(LayoutDIKey, { cls })\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;EA8CA,MAAM,QAAQ;EAEd,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,QAAQ;EAExB,MAAM,eAAe,IAAc,CAAC,CAAC;EAErC,kBAAkB;GAChB,MAAM,EAAE,SAAS;GACjB,IAAI,CAAC,MAAM;IACT,aAAa,QAAQ,CAAC;IACtB;GACF;GACA,aAAa,QAAQ,OAAO,SAAS,WAAW,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI;EAC5E,CAAC;EAED,MAAM,QAAQ,eAA8B;GAC1C,MAAM,EAAE,MAAM,KAAK,cAAc;GACjC,OAAO;IACL,qBAAqB,aAAa,MAAM,KAAK,GAAG;IAChD,kBAAkB,OAAQ,OAAO,SAAS,WAAW,OAAO,KAAK,KAAK,GAAG,IAAK;IAC9E,WAAW,YAAY,SAAS,SAAS,KAAK,IAAI;GACpD;EACF,CAAC;EAED,MAAM,eAAe,WAAwB;EAC7C,MAAM,cAAc,WAAkD,CAAC,CAAC;EAExE,MAAM,iBAAiB,IAAc,CAAC,CAAC;EAEvC,SAAS,mBAAmB;GAC1B,MAAM,YAAY,aAAa;GAC/B,IAAI,CAAC,MAAM,aAAa,CAAC,aAAa,CAAC,MAAM,MAC3C,OAAQ,eAAe,QAAQ,CAAC;GAGlC,eAAe,QAAQ,aAAa,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK,GAAG,UAAU;IACvE,MAAM,MAAM,UAAU,SAAS;IAC/B,IAAI,CAAC,KAAK,OAAO;IACjB,OAAO,IAAI,aAAa,IAAI;GAC9B,CAAC;EACH;EAEA,MAAM;SAAO,MAAM;GAAW;SAAoB,MAAM;EAAI,SAAS;GACnE,eAAe;IACb,aAAa;GACf,CAAC;EACH,CAAC;EAED,kBAAkB;GAChB,SAAS;GACT,WAAW;IACT,aAAa;GACf;EACF,CAAC;;EAGD,SAAS,eAAe;GACtB,iBAAiB;GACjB,YAAY,MAAM,SAAS,GAAG,MAAM;IAClC,EAAE,OAAO,eAAe,MAAO,EAAG;GACpC,CAAC;EACH;EAMA,IAAI,WAAW;EACf,IAAI,WAAW;EACf,MAAM,qBAAqB,UAAkB;GAC3C,MAAM,YAAY,aAAa;GAC/B,IAAI,CAAC,WAAW;GAIhB,MAAM,UAAU,UAAU,SAAS;GACnC,MAAM,UAAU,UAAU,SAAS,QAAQ;GAC3C,WAAW,UAAU,QAAQ,sBAAsB,CAAC,CAAC,QAAQ;GAC7D,WAAW,UAAU,QAAQ,sBAAsB,CAAC,CAAC,QAAQ;GAC7D,KAAK,gBAAgB,KAAK;EAC5B;EACA,MAAM,gBAAgB,QAAgB,UAAkB;GAGtD,MAAM,UAAU,MAAM,cAAc,UAAU;GAC9C,MAAM,UAAU,MAAM,cAAc,QAAQ,MAAM;GAClD,MAAM,UAAU,KAAK,IAAI,UAAU,UAAU,KAAK,IAAI,WAAW,SAAS,MAAM,CAAC;GACjF,aAAa,MAAM,SAAS,GAAG,WAAW,QAAQ;GAClD,aAAa,MAAM,QAAQ,KAAK,GAAG,WAAW,QAAQ;EACxD;EAEA,QAAQ,aAAa,EAAE,IAAI,CAAC;;GA1I1B,
|
|
1
|
+
{"version":3,"file":"layout.js","names":["_openBlock","_createBlock","_resolveDynamicComponent","_normalizeClass","_unref","_normalizeStyle","_withCtx","_renderSlot","_createCommentVNode","_createElementBlock","_Fragment","_renderList","ULayoutResizer"],"sources":["../../../src/components/layout/layout.vue"],"sourcesContent":["<template>\n <component :is=\"tag\" :class=\"cls.b\" :style=\"style\" ref=\"containerRef\">\n <slot />\n\n <!-- 竖向调节 -->\n <ULayoutResizer\n v-for=\"(offset, index) of resizerOffsets\"\n :offset=\"offset\"\n :key=\"index\"\n ref=\"resizerRefs\"\n direction=\"vertical\"\n @resize=\"handleResize($event, index)\"\n @resize-start=\"handleStartResize(index)\"\n @resize-end=\"emit('resize-end', index)\"\n >\n </ULayoutResizer>\n\n <!-- 横向调节 -->\n <!-- <ULayoutResizer\n v-for=\"item in horizontalResizerList\"\n :key=\"item\"\n direction=\"horizontal\"\n /> -->\n </component>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useResizeObserver } from '@veltra/compositions'\nimport { bem, withUnit } from '@veltra/utils'\nimport {\n computed,\n shallowRef,\n type CSSProperties,\n provide,\n watchEffect,\n ref,\n watch,\n nextTick\n} from 'vue'\n\nimport type { LayoutEmits, LayoutProps } from '../../types'\nimport { LayoutDIKey } from './di'\nimport ULayoutResizer from './layout-resizer.vue'\n\ndefineOptions({ name: 'ULayout' })\n\nconst props = withDefaults(defineProps<LayoutProps>(), { tag: 'div' })\n\nconst emit = defineEmits<LayoutEmits>()\n\nconst cls = bem('layout')\n\nconst templateCols = ref<string[]>([])\n\nwatchEffect(() => {\n const { cols } = props\n if (!cols) {\n templateCols.value = []\n return\n }\n templateCols.value = typeof cols === 'string' ? cols.split(' ') : [...cols]\n})\n\nconst style = computed<CSSProperties>(() => {\n const { rows, gap, resizable } = props\n return {\n gridTemplateColumns: templateCols.value.join(' '),\n gridTemplateRows: rows ? (typeof rows === 'string' ? rows : rows.join(' ')) : '',\n columnGap: resizable ? '10px' : withUnit(gap, 'px')\n }\n})\n\nconst containerRef = shallowRef<HTMLElement>()\nconst resizerRefs = shallowRef<InstanceType<typeof ULayoutResizer>[]>([])\n\nconst resizerOffsets = ref<number[]>([])\n\nfunction getResizeOffsets() {\n const container = containerRef.value\n if (!props.resizable || !container || !props.cols) {\n return (resizerOffsets.value = [])\n }\n\n resizerOffsets.value = templateCols.value.slice(0, -1).map((_, index) => {\n const dom = container.children[index] as HTMLElement\n if (!dom) return 0\n return dom.offsetLeft + dom.offsetWidth\n })\n}\n\nwatch([() => props.resizable, containerRef, () => props.cols], () => {\n nextTick(() => {\n syncResizers()\n })\n})\n\nuseResizeObserver({\n targets: containerRef,\n onResize() {\n syncResizers()\n }\n})\n\n/** 重新测量各列边界并同步所有拖拽手柄位置(容器尺寸或 cols 程序化变化后调用) */\nfunction syncResizers() {\n getResizeOffsets()\n resizerRefs.value.forEach((r, i) => {\n r.update(resizerOffsets.value![i]!)\n })\n}\n\n// const horizontalResizerList = []\n\n// const resizing = shallowRef(false)\n\nlet prevSize = 0\nlet nextSize = 0\nconst handleStartResize = (index: number) => {\n const container = containerRef.value\n if (!container) return\n\n // 拖拽前把相邻两列按实际渲染宽度固定成 px,\n // 这样拖拽时两列等量增减、容器整体宽度保持不变。\n const prevDom = container.children[index] as HTMLElement | undefined\n const nextDom = container.children[index + 1] as HTMLElement | undefined\n prevSize = prevDom ? prevDom.getBoundingClientRect().width : 0\n nextSize = nextDom ? nextDom.getBoundingClientRect().width : 0\n emit('resize-start', index)\n}\nconst handleResize = (offset: number, index: number) => {\n // 钳位到 [colMin-prevSize, nextSize-colMin],避免轨道尺寸出现负值或小于列最小宽度——\n // 一旦 grid-template-columns 中带负值,整条声明会被浏览器丢弃。\n const minPrev = props.colMinSizes?.[index] ?? 0\n const minNext = props.colMinSizes?.[index + 1] ?? 0\n const clamped = Math.max(minPrev - prevSize, Math.min(nextSize - minNext, offset))\n templateCols.value[index] = `${prevSize + clamped}px`\n templateCols.value[index + 1] = `${nextSize - clamped}px`\n}\n\nprovide(LayoutDIKey, { cls })\n</script>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-item.js","names":[],"sources":["../../../src/components/list/list-item.vue"],"sourcesContent":["<template>\n <li :class=\"cls.b\">\n <slot />\n </li>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem } from '@veltra/utils'\n\ndefineOptions({ name: 'UListItem' })\n\nconst cls = bem('list-item')\n</script>\n"],"mappings":";;;;;;;EAWA,MAAM,MAAM,IAAI,WAAW;;GAVzB,
|
|
1
|
+
{"version":3,"file":"list-item.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_renderSlot"],"sources":["../../../src/components/list/list-item.vue"],"sourcesContent":["<template>\n <li :class=\"cls.b\">\n <slot />\n </li>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem } from '@veltra/utils'\n\ndefineOptions({ name: 'UListItem' })\n\nconst cls = bem('list-item')\n</script>\n"],"mappings":";;;;;;;EAWA,MAAM,MAAM,IAAI,WAAW;;GAVzB,OAAAA,UAAA,GAAAC,mBAEK,MAAA,EAFA,OAAKC,eAAEC,MAAA,GAAA,CAAG,CAAC,CAAC,EAAA,GACf,CAAAC,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","names":[],"sources":["../../../src/components/list/list.vue"],"sourcesContent":["<template>\n <u-scroll tag=\"ul\" :class=\"[cls.b, cls.m(size)]\">\n <slot v-for=\"(item, index) of data\" v-bind=\"{ item, index }\" />\n </u-scroll>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { bem } from '@veltra/utils'\n\nimport type { ListProps } from '../../types'\nimport type { ComponentSize } from '../../types'\nimport { UScroll } from '../scroll'\n\ndefineOptions({ name: 'UList' })\n\nconst props = withDefaults(defineProps<ListProps>(), {})\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('list')\n</script>\n"],"mappings":";;;;;;;;;;;;;EAkBA,MAAM,EAAE,SAAS,iBAAiB,
|
|
1
|
+
{"version":3,"file":"list.js","names":["props","_openBlock","_createBlock","_unref","UScroll","_normalizeClass","_withCtx","_createElementBlock","_Fragment","_renderList","_renderSlot","_mergeProps"],"sources":["../../../src/components/list/list.vue"],"sourcesContent":["<template>\n <u-scroll tag=\"ul\" :class=\"[cls.b, cls.m(size)]\">\n <slot v-for=\"(item, index) of data\" v-bind=\"{ item, index }\" />\n </u-scroll>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { bem } from '@veltra/utils'\n\nimport type { ListProps } from '../../types'\nimport type { ComponentSize } from '../../types'\nimport { UScroll } from '../scroll'\n\ndefineOptions({ name: 'UList' })\n\nconst props = withDefaults(defineProps<ListProps>(), {})\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('list')\n</script>\n"],"mappings":";;;;;;;;;;;;;EAkBA,MAAM,EAAE,SAAS,iBAAiB,CAACA,OAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,MAAM,IAAI,MAAM;;GAnBpB,OAAAC,UAAA,GAAAC,YAEWC,MAAAC,WAAA,GAAA;IAFD,KAAI;IAAM,OAAKC,eAAA,CAAGF,MAAA,GAAA,CAAG,CAAC,GAAGA,MAAA,GAAA,CAAG,CAAC,EAAEA,MAAA,IAAA,CAAI,CAAA,CAAA;;IACrC,SAAAG,cAA6B,EAAnCL,UAAA,IAAA,GAAAM,mBAA+DC,UAAA,MAAAC,WAAjC,QAAA,OAAhB,MAAM,UAAK;KAAzB,OAAAC,WAA+D,KAAA,QAAA,WAA/DC,WAA+D,EAAA,SAAA,KAAA,GAAA;MAAjB;MAAM;KAAK,CAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loading.js","names":[],"sources":["../../../src/components/loading/loading.vue"],"sourcesContent":["<template>\n <transition name=\"fade\" appear>\n <div :class=\"className\" :style=\"{ zIndex: zIndex() }\">\n <div :class=\"cls.e('loader')\"></div>\n </div>\n </transition>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { bem, zIndex } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { LoadingProps, ComponentSize } from '../../types'\n\ndefineOptions({ name: 'ULoading' })\n\nconst props = withDefaults(defineProps<LoadingProps>(), { type: 'dual-ring' })\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('loading')\n\nconst className = computed(() => {\n return [cls.b, cls.m(size.value), cls.e(props.type)]\n})\n</script>\n"],"mappings":";;;;;;;;;EAiBA,MAAM,QAAQ;EAEd,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,MAAM,IAAI,SAAS;EAEzB,MAAM,YAAY,eAAe;GAC/B,OAAO;IAAC,IAAI;IAAG,IAAI,EAAE,KAAK,KAAK;IAAG,IAAI,EAAE,MAAM,IAAI;GAAC;EACrD,CAAC;;GAxBC,
|
|
1
|
+
{"version":3,"file":"loading.js","names":["_openBlock","_createBlock","_Transition","_withCtx","_createElementVNode","_normalizeClass","_normalizeStyle","_unref"],"sources":["../../../src/components/loading/loading.vue"],"sourcesContent":["<template>\n <transition name=\"fade\" appear>\n <div :class=\"className\" :style=\"{ zIndex: zIndex() }\">\n <div :class=\"cls.e('loader')\"></div>\n </div>\n </transition>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { bem, zIndex } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { LoadingProps, ComponentSize } from '../../types'\n\ndefineOptions({ name: 'ULoading' })\n\nconst props = withDefaults(defineProps<LoadingProps>(), { type: 'dual-ring' })\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('loading')\n\nconst className = computed(() => {\n return [cls.b, cls.m(size.value), cls.e(props.type)]\n})\n</script>\n"],"mappings":";;;;;;;;;EAiBA,MAAM,QAAQ;EAEd,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,MAAM,IAAI,SAAS;EAEzB,MAAM,YAAY,eAAe;GAC/B,OAAO;IAAC,IAAI;IAAG,IAAI,EAAE,KAAK,KAAK;IAAG,IAAI,EAAE,MAAM,IAAI;GAAC;EACrD,CAAC;;GAxBC,OAAAA,UAAA,GAAAC,YAIaC,YAAA;IAJD,MAAK;IAAO,QAAA;;IACtB,SAAAC,cAEM,CAFNC,mBAEM,OAAA;KAFA,OAAKC,eAAE,UAAA,KAAS;KAAG,OAAKC,eAAA,EAAA,QAAYC,MAAA,MAAA,CAAM,CAAA,EAAA,CAAA;IAC9C,GAAA,CAAAH,mBAAoC,OAAA,EAA9B,OAAKC,eAAEE,MAAA,GAAA,CAAG,CAAC,EAAC,QAAA,CAAA,EAAA,GAAA,MAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-box.js","names":[],"sources":["../../../src/components/message/message-box.vue"],"sourcesContent":["<template>\n <transition-group name=\"message\" appear @after-leave=\"handleAfterLeave\">\n <UMessage\n v-for=\"({ onClose, ...message }, index) of messages\"\n v-bind=\"message\"\n :data-id=\"message.key\"\n @close=\"handleClose(index, onClose)\"\n />\n </transition-group>\n</template>\n\n<script lang=\"ts\" setup>\nimport type { MessageOptions } from '../../types'\nimport UMessage from './message.vue'\n\ndefineOptions({ name: 'UMessageBox' })\n\ndefineProps<{ messages: Array<Omit<MessageOptions & { key: string }, 'onClosed'>> }>()\n\nconst emit = defineEmits<{ (e: 'closed', id: string): void; (e: 'close', index: number): void }>()\n\nfunction handleAfterLeave(el: Element) {\n emit('closed', (el as HTMLElement).dataset.id as string)\n}\n\nfunction handleClose(i: number, onClose?: () => void) {\n emit('close', i)\n onClose?.()\n}\n</script>\n"],"mappings":";;;;;;;;;EAmBA,MAAM,OAAO;EAEb,SAAS,iBAAiB,IAAa;GACrC,KAAK,UAAW,GAAmB,QAAQ,EAAY;EACzD;EAEA,SAAS,YAAY,GAAW,SAAsB;GACpD,KAAK,SAAS,CAAC;GACf,UAAU;EACZ;;GA3BE,
|
|
1
|
+
{"version":3,"file":"message-box.js","names":["_openBlock","_createBlock","_TransitionGroup","_withCtx","_createElementBlock","_Fragment","_renderList","UMessage","_mergeProps"],"sources":["../../../src/components/message/message-box.vue"],"sourcesContent":["<template>\n <transition-group name=\"message\" appear @after-leave=\"handleAfterLeave\">\n <UMessage\n v-for=\"({ onClose, ...message }, index) of messages\"\n v-bind=\"message\"\n :data-id=\"message.key\"\n @close=\"handleClose(index, onClose)\"\n />\n </transition-group>\n</template>\n\n<script lang=\"ts\" setup>\nimport type { MessageOptions } from '../../types'\nimport UMessage from './message.vue'\n\ndefineOptions({ name: 'UMessageBox' })\n\ndefineProps<{ messages: Array<Omit<MessageOptions & { key: string }, 'onClosed'>> }>()\n\nconst emit = defineEmits<{ (e: 'closed', id: string): void; (e: 'close', index: number): void }>()\n\nfunction handleAfterLeave(el: Element) {\n emit('closed', (el as HTMLElement).dataset.id as string)\n}\n\nfunction handleClose(i: number, onClose?: () => void) {\n emit('close', i)\n onClose?.()\n}\n</script>\n"],"mappings":";;;;;;;;;EAmBA,MAAM,OAAO;EAEb,SAAS,iBAAiB,IAAa;GACrC,KAAK,UAAW,GAAmB,QAAQ,EAAY;EACzD;EAEA,SAAS,YAAY,GAAW,SAAsB;GACpD,KAAK,SAAS,CAAC;GACf,UAAU;EACZ;;GA3BE,OAAAA,UAAA,GAAAC,YAOmBC,iBAAA;IAPD,MAAK;IAAU,QAAA;IAAQ,cAAa;;IAElD,SAAAC,cAAoD,EADtDH,UAAA,IAAA,GAAAI,mBAKEC,UAAA,MAAAC,WAJ2C,QAAA,WAAQ,EAAzC,SAAO,GAAK,WAAW,UAAK;KADxC,OAAAN,UAAA,GAAAC,YAKEM,aALFC,WAKE,EAAA,SAAA,KAAA,GAHQ,SAAO;MACd,WAAS,QAAQ;MACjB,UAAK,WAAE,YAAY,OAAO,OAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message.js","names":[],"sources":["../../../src/components/message/message.vue"],"sourcesContent":["<template>\n <li\n :class=\"[cls.b, cls.m(size), cls.m('color-' + getTypeColor(type))]\"\n @mouseenter=\"suspendClose\"\n @mouseleave=\"close\"\n >\n <div :class=\"cls.e('icon')\">\n <UIcon>\n <component :is=\"getTypeIcon(type, icon)\" />\n </UIcon>\n </div>\n <div :class=\"cls.e('content')\" v-if=\"html\" v-html=\"message\"></div>\n <div :class=\"cls.e('content')\" v-else>\n {{ message }}\n </div>\n <div :class=\"cls.e('close')\" v-if=\"closable || duration === 0\" @click.stop=\"immediateClose\">\n <UIcon><Close /></UIcon>\n </div>\n </li>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { Close } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { onMounted } from 'vue'\n\nimport type { MessageProps } from '../../types'\nimport { UIcon } from '../icon'\nimport { getTypeColor, getTypeIcon } from './helper'\n\ndefineOptions({ name: 'UMessage' })\n\nconst props = withDefaults(defineProps<MessageProps>(), {\n type: 'default',\n duration: 3000,\n offset: 20\n})\n\nconst emit = defineEmits<{ (e: 'close'): void }>()\n\nconst { size } = useFallbackProps([props], { size: 'default' })\n\nconst cls = bem('message')\n\nlet startTime = 0\nlet timer: number\nlet restDuration = 0\n\nfunction close() {\n if (props.duration === 0) return\n startTime = Date.now()\n timer = setTimeout(() => {\n emit('close')\n }, restDuration)\n}\n\nfunction startClose() {\n if (props.duration <= 0) return\n restDuration = props.duration\n close()\n}\n\nonMounted(() => {\n startClose()\n})\n\nfunction suspendClose() {\n clearTimeout(timer)\n restDuration = restDuration - (Date.now() - startTime)\n}\n\nfunction immediateClose() {\n emit('close')\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;EAiCA,MAAM,QAAQ;EAMd,MAAM,OAAO;EAEb,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAAU,CAAC;EAE9D,MAAM,MAAM,IAAI,SAAS;EAEzB,IAAI,YAAY;EAChB,IAAI;EACJ,IAAI,eAAe;EAEnB,SAAS,QAAQ;GACf,IAAI,MAAM,aAAa,GAAG;GAC1B,YAAY,KAAK,IAAI;GACrB,QAAQ,iBAAiB;IACvB,KAAK,OAAO;GACd,GAAG,YAAY;EACjB;EAEA,SAAS,aAAa;GACpB,IAAI,MAAM,YAAY,GAAG;GACzB,eAAe,MAAM;GACrB,MAAM;EACR;EAEA,gBAAgB;GACd,WAAW;EACb,CAAC;EAED,SAAS,eAAe;GACtB,aAAa,KAAK;GAClB,eAAe,gBAAgB,KAAK,IAAI,IAAI;EAC9C;EAEA,SAAS,iBAAiB;GACxB,KAAK,OAAO;EACd;;GAzEE,
|
|
1
|
+
{"version":3,"file":"message.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_createVNode","UIcon","_withCtx","_createBlock","_resolveDynamicComponent","_toDisplayString","_withModifiers","_createCommentVNode"],"sources":["../../../src/components/message/message.vue"],"sourcesContent":["<template>\n <li\n :class=\"[cls.b, cls.m(size), cls.m('color-' + getTypeColor(type))]\"\n @mouseenter=\"suspendClose\"\n @mouseleave=\"close\"\n >\n <div :class=\"cls.e('icon')\">\n <UIcon>\n <component :is=\"getTypeIcon(type, icon)\" />\n </UIcon>\n </div>\n <div :class=\"cls.e('content')\" v-if=\"html\" v-html=\"message\"></div>\n <div :class=\"cls.e('content')\" v-else>\n {{ message }}\n </div>\n <div :class=\"cls.e('close')\" v-if=\"closable || duration === 0\" @click.stop=\"immediateClose\">\n <UIcon><Close /></UIcon>\n </div>\n </li>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { Close } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { onMounted } from 'vue'\n\nimport type { MessageProps } from '../../types'\nimport { UIcon } from '../icon'\nimport { getTypeColor, getTypeIcon } from './helper'\n\ndefineOptions({ name: 'UMessage' })\n\nconst props = withDefaults(defineProps<MessageProps>(), {\n type: 'default',\n duration: 3000,\n offset: 20\n})\n\nconst emit = defineEmits<{ (e: 'close'): void }>()\n\nconst { size } = useFallbackProps([props], { size: 'default' })\n\nconst cls = bem('message')\n\nlet startTime = 0\nlet timer: number\nlet restDuration = 0\n\nfunction close() {\n if (props.duration === 0) return\n startTime = Date.now()\n timer = setTimeout(() => {\n emit('close')\n }, restDuration)\n}\n\nfunction startClose() {\n if (props.duration <= 0) return\n restDuration = props.duration\n close()\n}\n\nonMounted(() => {\n startClose()\n})\n\nfunction suspendClose() {\n clearTimeout(timer)\n restDuration = restDuration - (Date.now() - startTime)\n}\n\nfunction immediateClose() {\n emit('close')\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;EAiCA,MAAM,QAAQ;EAMd,MAAM,OAAO;EAEb,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAAU,CAAC;EAE9D,MAAM,MAAM,IAAI,SAAS;EAEzB,IAAI,YAAY;EAChB,IAAI;EACJ,IAAI,eAAe;EAEnB,SAAS,QAAQ;GACf,IAAI,MAAM,aAAa,GAAG;GAC1B,YAAY,KAAK,IAAI;GACrB,QAAQ,iBAAiB;IACvB,KAAK,OAAO;GACd,GAAG,YAAY;EACjB;EAEA,SAAS,aAAa;GACpB,IAAI,MAAM,YAAY,GAAG;GACzB,eAAe,MAAM;GACrB,MAAM;EACR;EAEA,gBAAgB;GACd,WAAW;EACb,CAAC;EAED,SAAS,eAAe;GACtB,aAAa,KAAK;GAClB,eAAe,gBAAgB,KAAK,IAAI,IAAI;EAC9C;EAEA,SAAS,iBAAiB;GACxB,KAAK,OAAO;EACd;;GAzEE,OAAAA,UAAA,GAAAC,mBAiBK,MAAA;IAhBF,OAAKC,eAAA;KAAGC,MAAA,GAAA,CAAG,CAAC;KAAGA,MAAA,GAAA,CAAG,CAAC,EAAEA,MAAA,IAAA,CAAI;KAAGA,MAAA,GAAA,CAAG,CAAC,EAAC,WAAYA,MAAA,YAAA,CAAY,CAAC,QAAA,IAAI,CAAA;IAAA,CAAA;IAC9D,cAAY;IACZ,cAAY;;IAEbC,mBAIM,OAAA,EAJA,OAAKF,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA,CAAA,EAAA,GAChB,CAAAE,YAEQF,MAAAG,WAAA,GAAA,MAAA;KADN,SAAAC,cAA2C,EAA3CP,UAAA,GAAAQ,YAA2CC,wBAA3BN,MAAA,WAAA,CAAW,CAAC,QAAA,MAAM,QAAA,IAAI,CAAA,CAAA,EAAA,CAAA;;;IAGL,QAAA,QAArCH,UAAA,GAAAC,mBAAkE,OAAA;;KAA5D,OAAKC,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,SAAA,CAAA;KAAyB,WAAQ,QAAA;IACnD,GAAA,MAAA,IAAA,UAAA,MAAAH,UAAA,GAAAC,mBAEM,OAAA;;KAFA,OAAKC,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,SAAA,CAAA;IACb,GAAAO,gBAAA,QAAA,OAAO,GAAA,CAAA;IAEuB,QAAA,YAAY,QAAA,aAAQ,KAAvDV,UAAA,GAAAC,mBAEM,OAAA;;KAFA,OAAKC,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,OAAA,CAAA;KAA8C,SAAKQ,cAAO,gBAAc,CAAA,MAAA,CAAA;IACxF,GAAA,CAAAN,YAAwBF,MAAAG,WAAA,GAAA,MAAA;KAAjB,SAAAC,cAAS,CAATF,YAASF,MAAA,KAAA,CAAA,CAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-confirm-box.js","names":[],"sources":["../../../src/components/message-confirm/message-confirm-box.vue"],"sourcesContent":["<template>\n <transition-group name=\"message-confirm\" tag=\"div\" appear @after-leave=\"handleAfterLeave\">\n <UMessageConfirm\n v-for=\"{ onClose, onClosed, ...confirm } of confirms\"\n v-bind=\"confirm\"\n :key=\"confirm.key\"\n :data-key=\"confirm.key\"\n @close=\"handleClose(confirm.key, onClose, $event)\"\n />\n </transition-group>\n</template>\n\n<script lang=\"ts\" setup>\nimport type { MessageConfirmAction, MessageConfirmOptions } from '../../types'\nimport UMessageConfirm from './message-confirm.vue'\n\ndefineOptions({ name: 'UMessageConfirmBox' })\n\ntype ConfirmItem = MessageConfirmOptions & { key: string }\n\ndefineProps<{ confirms: ConfirmItem[] }>()\n\nconst emit = defineEmits<{\n (e: 'closed', key: string): void\n (e: 'close', key: string, action: MessageConfirmAction): void\n}>()\n\nfunction handleAfterLeave(el: Element) {\n emit('closed', (el as HTMLElement).dataset.key as string)\n}\n\nfunction handleClose(key: string, onClose: ConfirmItem['onClose'], action: MessageConfirmAction) {\n emit('close', key, action)\n onClose?.(action)\n}\n</script>\n"],"mappings":";;;;;;;;;EAsBA,MAAM,OAAO;EAKb,SAAS,iBAAiB,IAAa;GACrC,KAAK,UAAW,GAAmB,QAAQ,GAAa;EAC1D;EAEA,SAAS,YAAY,KAAa,SAAiC,QAA8B;GAC/F,KAAK,SAAS,KAAK,MAAM;GACzB,UAAU,MAAM;EAClB;;GAjCE,
|
|
1
|
+
{"version":3,"file":"message-confirm-box.js","names":["_openBlock","_createBlock","_TransitionGroup","_withCtx","_createElementBlock","_Fragment","_renderList","UMessageConfirm","_mergeProps"],"sources":["../../../src/components/message-confirm/message-confirm-box.vue"],"sourcesContent":["<template>\n <transition-group name=\"message-confirm\" tag=\"div\" appear @after-leave=\"handleAfterLeave\">\n <UMessageConfirm\n v-for=\"{ onClose, onClosed, ...confirm } of confirms\"\n v-bind=\"confirm\"\n :key=\"confirm.key\"\n :data-key=\"confirm.key\"\n @close=\"handleClose(confirm.key, onClose, $event)\"\n />\n </transition-group>\n</template>\n\n<script lang=\"ts\" setup>\nimport type { MessageConfirmAction, MessageConfirmOptions } from '../../types'\nimport UMessageConfirm from './message-confirm.vue'\n\ndefineOptions({ name: 'UMessageConfirmBox' })\n\ntype ConfirmItem = MessageConfirmOptions & { key: string }\n\ndefineProps<{ confirms: ConfirmItem[] }>()\n\nconst emit = defineEmits<{\n (e: 'closed', key: string): void\n (e: 'close', key: string, action: MessageConfirmAction): void\n}>()\n\nfunction handleAfterLeave(el: Element) {\n emit('closed', (el as HTMLElement).dataset.key as string)\n}\n\nfunction handleClose(key: string, onClose: ConfirmItem['onClose'], action: MessageConfirmAction) {\n emit('close', key, action)\n onClose?.(action)\n}\n</script>\n"],"mappings":";;;;;;;;;EAsBA,MAAM,OAAO;EAKb,SAAS,iBAAiB,IAAa;GACrC,KAAK,UAAW,GAAmB,QAAQ,GAAa;EAC1D;EAEA,SAAS,YAAY,KAAa,SAAiC,QAA8B;GAC/F,KAAK,SAAS,KAAK,MAAM;GACzB,UAAU,MAAM;EAClB;;GAjCE,OAAAA,UAAA,GAAAC,YAQmBC,iBAAA;IARD,MAAK;IAAkB,KAAI;IAAM,QAAA;IAAQ,cAAa;;IAEpE,SAAAC,cAAqD,EADvDH,UAAA,IAAA,GAAAI,mBAMEC,UAAA,MAAAC,WAL4C,QAAA,WAAQ,EAA3C,SAAS,UAAQ,GAAK,cAAO;KADxC,OAAAN,UAAA,GAAAC,YAMEM,aANFC,WAME,EAAA,SAAA,KAAA,GAJQ,SAAO;MACd,KAAK,QAAQ;MACb,YAAU,QAAQ;MAClB,UAAK,WAAE,YAAY,QAAQ,KAAK,SAAS,MAAM"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-confirm.js","names":[],"sources":["../../../src/components/message-confirm/message-confirm.vue"],"sourcesContent":["<template>\n <div :class=\"[cls.b, cls.m(size)]\" :style=\"overlayStyle\">\n <div :class=\"cls.e('mask')\" :style=\"overlayStyle\">\n <div :class=\"cls.e('box')\" :style=\"overlayStyle\">\n <div :class=\"cls.e('header')\" v-if=\"title\">{{ title }}</div>\n <div :class=\"cls.e('content')\">{{ message }}</div>\n <div :class=\"cls.e('footer')\">\n <UButton\n plain\n @click=\"emit('close', 'cancel')\"\n :class=\"cls.em('footer', 'btn')\"\n v-if=\"cancelButtonText\"\n >{{ cancelButtonText }}</UButton\n >\n <UButton\n :type=\"confirmButtonType\"\n @click=\"emit('close', 'confirm')\"\n :class=\"cls.em('footer', 'btn')\"\n >{{ confirmButtonText }}</UButton\n >\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { bem, zIndex } from '@veltra/utils'\n\nimport type {\n MessageConfirmProps,\n MessageConfirmEmits,\n ColorType,\n ComponentSize\n} from '../../types'\nimport { UButton } from '../button'\n\ndefineOptions({ name: 'UMessageConfirm' })\n\nconst props = withDefaults(defineProps<MessageConfirmProps>(), {\n title: '',\n message: '',\n confirmButtonText: '确定',\n confirmButtonType: 'primary' as ColorType,\n cancelButtonText: ''\n})\n\nconst emit = defineEmits<MessageConfirmEmits>()\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('message-confirm')\nconst overlayStyle = { zIndex: props.zIndex ?? zIndex() }\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;EAwCA,MAAM,QAAQ;EAQd,MAAM,OAAO;EAEb,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,MAAM,IAAI,iBAAiB;EACjC,MAAM,eAAe,EAAE,QAAQ,MAAM,UAAU,OAAO,EAAE;;GApDtD,
|
|
1
|
+
{"version":3,"file":"message-confirm.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_toDisplayString","_createCommentVNode","_createBlock","UButton","_withCtx","_createTextVNode","_createVNode"],"sources":["../../../src/components/message-confirm/message-confirm.vue"],"sourcesContent":["<template>\n <div :class=\"[cls.b, cls.m(size)]\" :style=\"overlayStyle\">\n <div :class=\"cls.e('mask')\" :style=\"overlayStyle\">\n <div :class=\"cls.e('box')\" :style=\"overlayStyle\">\n <div :class=\"cls.e('header')\" v-if=\"title\">{{ title }}</div>\n <div :class=\"cls.e('content')\">{{ message }}</div>\n <div :class=\"cls.e('footer')\">\n <UButton\n plain\n @click=\"emit('close', 'cancel')\"\n :class=\"cls.em('footer', 'btn')\"\n v-if=\"cancelButtonText\"\n >{{ cancelButtonText }}</UButton\n >\n <UButton\n :type=\"confirmButtonType\"\n @click=\"emit('close', 'confirm')\"\n :class=\"cls.em('footer', 'btn')\"\n >{{ confirmButtonText }}</UButton\n >\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { bem, zIndex } from '@veltra/utils'\n\nimport type {\n MessageConfirmProps,\n MessageConfirmEmits,\n ColorType,\n ComponentSize\n} from '../../types'\nimport { UButton } from '../button'\n\ndefineOptions({ name: 'UMessageConfirm' })\n\nconst props = withDefaults(defineProps<MessageConfirmProps>(), {\n title: '',\n message: '',\n confirmButtonText: '确定',\n confirmButtonType: 'primary' as ColorType,\n cancelButtonText: ''\n})\n\nconst emit = defineEmits<MessageConfirmEmits>()\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('message-confirm')\nconst overlayStyle = { zIndex: props.zIndex ?? zIndex() }\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;EAwCA,MAAM,QAAQ;EAQd,MAAM,OAAO;EAEb,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,MAAM,IAAI,iBAAiB;EACjC,MAAM,eAAe,EAAE,QAAQ,MAAM,UAAU,OAAO,EAAE;;GApDtD,OAAAA,UAAA,GAAAC,mBAsBM,OAAA;IAtBA,OAAKC,eAAA,CAAGC,MAAA,GAAA,CAAG,CAAC,GAAGA,MAAA,GAAA,CAAG,CAAC,EAAEA,MAAA,IAAA,CAAI,CAAA,CAAA;IAAK,OAAO;GACzC,GAAA,CAAAC,mBAoBM,OAAA;IApBA,OAAKF,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA,CAAA;IAAW,OAAO;GAClC,GAAA,CAAAC,mBAkBM,OAAA;IAlBA,OAAKF,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,KAAA,CAAA;IAAU,OAAO;;IACG,QAAA,SAApCH,UAAA,GAAAC,mBAA4D,OAAA;;KAAtD,OAAKC,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,QAAA,CAAA;IAA4B,GAAAE,gBAAA,QAAA,KAAK,GAAA,CAAA,KAAAC,mBAAA,QAAA,IAAA;IACnDF,mBAAkD,OAAA,EAA5C,OAAKF,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,SAAA,CAAA,EAAgB,GAAAE,gBAAA,QAAA,OAAO,GAAA,CAAA;IACzCD,mBAcM,OAAA,EAdA,OAAKF,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,QAAA,CAAA,EAAA,GAKR,CAAA,QAAA,oBAJRH,UAAA,GAAAO,YAMCJ,MAAAK,WAAA,GAAA;;KALC,OAAA;KACC,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,SAAA,QAAA;KACX,OAAKN,eAAEC,MAAA,GAAA,CAAG,CAAC,GAAE,UAAA,KAAA,CAAA;;KAEb,SAAAM,cAAsB,CAAnBC,gBAAAL,gBAAA,QAAA,gBAAgB,GAAA,CAAA,CAAA,CAAA;;IAEtB,GAAA,GAAA,CAAA,OAAA,CAAA,KAAAC,mBAAA,QAAA,IAAA,GAAAK,YAKCR,MAAAK,WAAA,GAAA;KAJE,MAAM,QAAA;KACN,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,SAAA,SAAA;KACX,OAAKN,eAAEC,MAAA,GAAA,CAAG,CAAC,GAAE,UAAA,KAAA,CAAA;;KACb,SAAAM,cAAuB,CAApBC,gBAAAL,gBAAA,QAAA,iBAAiB,GAAA,CAAA,CAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multi-select-option.js","names":[],"sources":["../../../src/components/multi-select/multi-select-option.vue"],"sourcesContent":["<template>\n <li\n :class=\"optionClass\"\n @click=\"handleClick\"\n @mousedown=\"handleMousedown\"\n @mouseup=\"handleMouseup\"\n @mouseleave=\"handleMouseleave\"\n :ref=\"measureRef\"\n >\n <u-checkbox\n :class=\"checkboxClass\"\n :model-value=\"checked\"\n @update:model-value=\"emit('check', $event)\"\n @click.stop\n :disabled=\"disabled\"\n />\n\n <slot />\n </li>\n</template>\n\n<script lang=\"ts\" setup>\nimport { Ripple } from '@veltra/directives'\nimport { inject, onBeforeUnmount, shallowRef } from 'vue'\n\nimport { UCheckbox } from '../checkbox'\nimport { MultiSelectDIKey } from './di'\n\ndefineOptions({ name: 'UMultiSelectOption' })\n\nconst props = defineProps<{\n option: Record<string, any>\n disabled?: boolean\n checked: boolean\n /**\n * 虚拟项索引:对应 `options` 数组中的绝对位置。\n * 非虚拟模式下可省略;虚拟模式下必须传入,否则元素卸载时 Virtualizer 无法及时解绑,\n * 会因为 ResizeObserver 对脱离 DOM 的元素回调 size=0 而污染尺寸缓存。\n */\n index?: number\n measureElement?: (index: number, el: Element | null) => void\n}>()\n\nfunction measureRef(el: unknown) {\n if (typeof props.index !== 'number' || !props.measureElement) return\n props.measureElement(props.index, el as Element | null)\n}\n\nconst emit = defineEmits<{ (e: 'check', checked: boolean): void }>()\n\nconst { optionClass, rippleClass, checkboxClass } = inject(MultiSelectDIKey)!\n\nconst rippleRef = shallowRef<Ripple | null>(null)\n\nfunction handleClick(e) {\n if (props.disabled) return\n emit('check', !props.checked)\n}\n\nfunction handleMousedown(e: MouseEvent) {\n if (props.disabled) return\n\n // 清理旧实例,避免同一元素上多个 Ripple 实例同时修改样式\n if (rippleRef.value) {\n rippleRef.value.remove()\n rippleRef.value = null\n }\n\n rippleRef.value = new Ripple(e.currentTarget as HTMLElement, { rippleClass })\n\n rippleRef.value.showByEvent(e)\n}\n\nfunction handleMouseleave() {\n rippleRef.value?.remove()\n rippleRef.value = null\n}\n\nfunction handleMouseup() {\n rippleRef.value?.remove()\n rippleRef.value = null\n}\n\nonBeforeUnmount(() => {\n rippleRef.value?.remove()\n rippleRef.value = null\n})\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;EA8BA,MAAM,QAAQ;EAad,SAAS,WAAW,IAAa;GAC/B,IAAI,OAAO,MAAM,UAAU,YAAY,CAAC,MAAM,gBAAgB;GAC9D,MAAM,eAAe,MAAM,OAAO,EAAoB;EACxD;EAEA,MAAM,OAAO;EAEb,MAAM,EAAE,aAAa,aAAa,kBAAkB,OAAO,gBAAgB;EAE3E,MAAM,YAAY,WAA0B,IAAI;EAEhD,SAAS,YAAY,GAAG;GACtB,IAAI,MAAM,UAAU;GACpB,KAAK,SAAS,CAAC,MAAM,OAAO;EAC9B;EAEA,SAAS,gBAAgB,GAAe;GACtC,IAAI,MAAM,UAAU;GAGpB,IAAI,UAAU,OAAO;IACnB,UAAU,MAAM,OAAO;IACvB,UAAU,QAAQ;GACpB;GAEA,UAAU,QAAQ,IAAI,OAAO,EAAE,eAA8B,EAAE,YAAY,CAAC;GAE5E,UAAU,MAAM,YAAY,CAAC;EAC/B;EAEA,SAAS,mBAAmB;GAC1B,UAAU,OAAO,OAAO;GACxB,UAAU,QAAQ;EACpB;EAEA,SAAS,gBAAgB;GACvB,UAAU,OAAO,OAAO;GACxB,UAAU,QAAQ;EACpB;EAEA,sBAAsB;GACpB,UAAU,OAAO,OAAO;GACxB,UAAU,QAAQ;EACpB,CAAC;;GArFC,
|
|
1
|
+
{"version":3,"file":"multi-select-option.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_createVNode","UCheckbox","_withModifiers","_renderSlot"],"sources":["../../../src/components/multi-select/multi-select-option.vue"],"sourcesContent":["<template>\n <li\n :class=\"optionClass\"\n @click=\"handleClick\"\n @mousedown=\"handleMousedown\"\n @mouseup=\"handleMouseup\"\n @mouseleave=\"handleMouseleave\"\n :ref=\"measureRef\"\n >\n <u-checkbox\n :class=\"checkboxClass\"\n :model-value=\"checked\"\n @update:model-value=\"emit('check', $event)\"\n @click.stop\n :disabled=\"disabled\"\n />\n\n <slot />\n </li>\n</template>\n\n<script lang=\"ts\" setup>\nimport { Ripple } from '@veltra/directives'\nimport { inject, onBeforeUnmount, shallowRef } from 'vue'\n\nimport { UCheckbox } from '../checkbox'\nimport { MultiSelectDIKey } from './di'\n\ndefineOptions({ name: 'UMultiSelectOption' })\n\nconst props = defineProps<{\n option: Record<string, any>\n disabled?: boolean\n checked: boolean\n /**\n * 虚拟项索引:对应 `options` 数组中的绝对位置。\n * 非虚拟模式下可省略;虚拟模式下必须传入,否则元素卸载时 Virtualizer 无法及时解绑,\n * 会因为 ResizeObserver 对脱离 DOM 的元素回调 size=0 而污染尺寸缓存。\n */\n index?: number\n measureElement?: (index: number, el: Element | null) => void\n}>()\n\nfunction measureRef(el: unknown) {\n if (typeof props.index !== 'number' || !props.measureElement) return\n props.measureElement(props.index, el as Element | null)\n}\n\nconst emit = defineEmits<{ (e: 'check', checked: boolean): void }>()\n\nconst { optionClass, rippleClass, checkboxClass } = inject(MultiSelectDIKey)!\n\nconst rippleRef = shallowRef<Ripple | null>(null)\n\nfunction handleClick(e) {\n if (props.disabled) return\n emit('check', !props.checked)\n}\n\nfunction handleMousedown(e: MouseEvent) {\n if (props.disabled) return\n\n // 清理旧实例,避免同一元素上多个 Ripple 实例同时修改样式\n if (rippleRef.value) {\n rippleRef.value.remove()\n rippleRef.value = null\n }\n\n rippleRef.value = new Ripple(e.currentTarget as HTMLElement, { rippleClass })\n\n rippleRef.value.showByEvent(e)\n}\n\nfunction handleMouseleave() {\n rippleRef.value?.remove()\n rippleRef.value = null\n}\n\nfunction handleMouseup() {\n rippleRef.value?.remove()\n rippleRef.value = null\n}\n\nonBeforeUnmount(() => {\n rippleRef.value?.remove()\n rippleRef.value = null\n})\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;EA8BA,MAAM,QAAQ;EAad,SAAS,WAAW,IAAa;GAC/B,IAAI,OAAO,MAAM,UAAU,YAAY,CAAC,MAAM,gBAAgB;GAC9D,MAAM,eAAe,MAAM,OAAO,EAAoB;EACxD;EAEA,MAAM,OAAO;EAEb,MAAM,EAAE,aAAa,aAAa,kBAAkB,OAAO,gBAAgB;EAE3E,MAAM,YAAY,WAA0B,IAAI;EAEhD,SAAS,YAAY,GAAG;GACtB,IAAI,MAAM,UAAU;GACpB,KAAK,SAAS,CAAC,MAAM,OAAO;EAC9B;EAEA,SAAS,gBAAgB,GAAe;GACtC,IAAI,MAAM,UAAU;GAGpB,IAAI,UAAU,OAAO;IACnB,UAAU,MAAM,OAAO;IACvB,UAAU,QAAQ;GACpB;GAEA,UAAU,QAAQ,IAAI,OAAO,EAAE,eAA8B,EAAE,YAAY,CAAC;GAE5E,UAAU,MAAM,YAAY,CAAC;EAC/B;EAEA,SAAS,mBAAmB;GAC1B,UAAU,OAAO,OAAO;GACxB,UAAU,QAAQ;EACpB;EAEA,SAAS,gBAAgB;GACvB,UAAU,OAAO,OAAO;GACxB,UAAU,QAAQ;EACpB;EAEA,sBAAsB;GACpB,UAAU,OAAO,OAAO;GACxB,UAAU,QAAQ;EACpB,CAAC;;GArFC,OAAAA,UAAA,GAAAC,mBAiBK,MAAA;IAhBF,OAAKC,eAAEC,MAAA,WAAA,CAAW;IAClB,SAAO;IACP,aAAW;IACX,WAAS;IACT,cAAY;IACZ,KAAK;GAEN,GAAA,CAAAC,YAMED,MAAAE,WAAA,GAAA;IALC,OAAKH,eAAEC,MAAA,aAAA,CAAa;IACpB,eAAa,QAAA;IACb,uBAAkB,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,SAAU,MAAM;IACxC,SAAK,OAAA,OAAA,OAAA,KAAAG,oBAAN,CAAA,GAAW,CAAA,MAAA,CAAA;IACV,UAAU,QAAA;;;;;GAGb,CAAA,GAAAC,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,EAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multi-select.js","names":["$attrs"],"sources":["../../../src/components/multi-select/multi-select.vue"],"sourcesContent":["<template>\n <u-dropdown\n v-if=\"!readonly\"\n v-bind=\"$attrs\"\n trigger=\"click\"\n ref=\"dropdownRef\"\n :class=\"[cls.b, cls.m(size), bem.is('disabled', disabled), bem.is('focus', dropdownVisible)]\"\n :content-class=\"[cls.e('panel'), cls.em('panel', size), contentClass]\"\n :content-style=\"contentStyle\"\n :min-width=\"minWidth\"\n :width=\"width\"\n @mouseenter=\"hovered = true\"\n @mouseleave=\"hovered = false\"\n :disabled=\"disabled\"\n @update:visible=\"handleDropdownVisible\"\n >\n <!-- 触发 -->\n <template #trigger>\n <span :class=\"cls.e('placeholder')\" v-if=\"!filterable && !model?.length\">\n {{ placeholder }}\n </span>\n\n <div v-if=\"model?.length || filterable\" :class=\"cls.e('tags')\">\n <u-tag\n v-for=\"option of tags\"\n :key=\"option[valueKey]\"\n :closable=\"!disabled\"\n size=\"small\"\n @close=\"handleClose(option)\"\n >\n {{ option[labelKey] }}\n </u-tag>\n <u-tag v-if=\"restTag\" size=\"small\"> {{ restTag }}+ </u-tag>\n\n <!-- 内嵌查询输入框:承载过滤与回车创建 -->\n <input\n v-if=\"filterable\"\n ref=\"inputRef\"\n :class=\"cls.e('input')\"\n v-model=\"queryString\"\n :placeholder=\"model?.length ? '' : placeholder\"\n :disabled=\"disabled\"\n @click.stop=\"handleInputClick\"\n @focus=\"handleInputFocus\"\n @keydown.enter.prevent=\"handleCreateByEnter\"\n />\n </div>\n\n <transition name=\"zoom-in\" mode=\"out-in\">\n <u-icon\n v-if=\"clearable && model?.length && hovered && !disabled\"\n :class=\"cls.e('clear')\"\n @click.stop=\"handleClear\"\n >\n <Close />\n </u-icon>\n\n <u-icon :class=\"cls.e('arrow')\" v-else><ArrowDown /></u-icon>\n </transition>\n </template>\n\n <!-- 下拉内容 -->\n <template #content>\n <!-- 多选栏 -->\n <div :class=\"cls.e('content-header')\">\n <u-checkbox\n :model-value=\"allChecked\"\n :indeterminate=\"indeterminate\"\n @update:model-value=\"handleCheckAll\"\n :disabled=\"max !== undefined\"\n >\n 全选\n </u-checkbox>\n\n <span> 已选 {{ model?.length }}/{{ max ?? options?.length ?? 0 }} </span>\n </div>\n\n <!-- 多选列表 -->\n <!--\n 虚拟化启用时内容容器 height 由 useVirtualizer 命令式写入;\n 模板不再绑定 totalSize,避免尺寸变化引起重渲染。\n -->\n <div v-if=\"loading\" :class=\"cls.e('loading')\">\n <ULoading type=\"dual-ring\" />\n </div>\n <u-scroll\n tag=\"ul\"\n :class=\"[cls.e('options')]\"\n ref=\"scrollRef\"\n v-else-if=\"options.length\"\n :content-class=\"[cls.e('options-wrap'), bem.is('virtual', virtualEnabled)]\"\n >\n <template v-if=\"virtualEnabled\">\n <u-multi-select-option\n v-for=\"{ option, index, key, label, offset } of virtualOptions\"\n :option=\"option\"\n :disabled=\"isDisabled(option)\"\n :key=\"key\"\n :style=\"{ transform: `translateY(${offset}px)` }\"\n @check=\"handleCheck(option, $event)\"\n :checked=\"checkedSet.has(option)\"\n :index=\"index\"\n :measure-element=\"measureElement\"\n >\n <slot v-bind=\"{ option, index }\">\n {{ label }}\n </slot>\n </u-multi-select-option>\n </template>\n\n <template v-else>\n <u-multi-select-option\n v-for=\"(option, index) of options\"\n :option=\"option\"\n :disabled=\"isDisabled(option)\"\n :key=\"chainObj(option).get(valueKey)\"\n @check=\"handleCheck(option, $event)\"\n :checked=\"checkedSet.has(option)\"\n >\n <slot v-bind=\"{ option, index }\">\n {{ chainObj(option).get(labelKey) }}\n </slot>\n </u-multi-select-option>\n </template>\n </u-scroll>\n\n <div v-else :class=\"cls.e('empty')\">\n <UEmpty />\n </div>\n </template>\n </u-dropdown>\n\n <div v-else-if=\"model?.length\" :class=\"[cls.m(size), cls.e('readonly-tags')]\">\n <div :class=\"cls.e('tags')\">\n <u-tag v-for=\"option of tags\" :key=\"option[valueKey]\" size=\"small\">\n {{ option[labelKey] }}\n </u-tag>\n </div>\n </div>\n\n <template v-else>\n {{ FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { o as chainObj } from '@cat-kit/core'\nimport { useFormFallbackProps, useVirtualizer } from '@veltra/compositions'\nimport { ArrowDown, Close } from '@veltra/icons/normal'\nimport { bem, fieldKey, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport {\n computed,\n nextTick,\n shallowRef,\n shallowReactive,\n watch,\n provide,\n useTemplateRef\n} from 'vue'\n\nimport type {\n MultiSelectEmits,\n MultiSelectProps,\n ScrollExposed,\n DropdownExposed\n} from '../../types'\nimport { UCheckbox } from '../checkbox'\nimport { UDropdown } from '../dropdown'\nimport { UEmpty } from '../empty'\nimport { UIcon } from '../icon'\nimport { ULoading } from '../loading'\nimport { UScroll } from '../scroll'\nimport { useOptions } from '../select/use-options'\nimport { UTag } from '../tag'\nimport { MultiSelectDIKey } from './di'\nimport UMultiSelectOption from './multi-select-option.vue'\n\ndefineOptions({ name: 'UMultiSelect', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<MultiSelectProps>(), {\n labelKey: 'label',\n valueKey: 'value',\n placeholder: '请选择',\n clearable: true,\n visibilityLimit: 3,\n disabled: undefined,\n readonly: undefined,\n minWidth: '220px'\n})\n\nconst emit = defineEmits<MultiSelectEmits>()\n\nconst cls = bem('multi-select')\n\nconst labelKey = computed(() => fieldKey(props.labelKey, 'label'))\nconst valueKey = computed(() => fieldKey(props.valueKey, 'value'))\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\nconst scrollRef = shallowRef<ScrollExposed>()\n\nconst hovered = shallowRef(false)\n\nconst {\n options: rawOptions,\n queryString,\n loading,\n allOptions: rawAllOptions\n} = useOptions({ props })\n\nconst createdOptions = shallowRef<Record<string, any>[]>([])\n\nconst options = computed(() => {\n const base = rawOptions.value\n if (!props.creatable || !createdOptions.value.length) return base\n\n const createdValues = new Set(createdOptions.value.map((o) => chainObj(o).get(valueKey.value)))\n const deduped = base.filter(\n (o) => !(o.__isTemp && createdValues.has(chainObj(o).get(valueKey.value)))\n )\n const dedupedValues = new Set(deduped.map((o) => chainObj(o).get(valueKey.value)))\n const toAdd = createdOptions.value.filter(\n (o) => !dedupedValues.has(chainObj(o).get(valueKey.value))\n )\n return [...toAdd, ...deduped]\n})\n\nconst allOptions = computed(() => {\n if (!props.creatable || !createdOptions.value.length) return rawAllOptions.value\n return [...createdOptions.value, ...rawAllOptions.value]\n})\n\nconst virtualEnabled = computed(() => options.value.length > 80)\n\nconst { virtualizer, items } = useVirtualizer({\n estimateSize: () => 40,\n count: computed(() => options.value.length),\n scrollEl: () => scrollRef.value?.containerRef ?? null,\n contentEl: () => (virtualEnabled.value ? (scrollRef.value?.contentRef ?? null) : null)\n})\n\nconst virtualOptions = computed(() => {\n const _options = options.value\n return items.value.map((v) => {\n const option = _options[v.index]!\n const val = chainObj(option).get(valueKey.value)\n return {\n option,\n index: v.index,\n val,\n key: v.index,\n offset: v.start,\n label: chainObj(option).get(labelKey.value)\n }\n })\n})\n\nconst measureElement: (index: number, el: Element | null) => void = (index, el) =>\n virtualizer.measureElement(index, el)\n\nconst filterable = computed(() => {\n return props.filterable || props.creatable || typeof props.options === 'function'\n})\n\nconst model = defineModel<Array<string | number>>()\n\nconst checkedSet = shallowReactive<Set<Record<string, any>>>(new Set())\nconst allChecked = computed(() => {\n return checkedSet.size === options.value.length\n})\nconst indeterminate = computed(() => {\n return checkedSet.size > 0 && !allChecked.value\n})\n\nconst optionsMap = computed(() => {\n return new Map<string | number, Record<string, any>>(\n allOptions.value.map((option) => [option[valueKey.value], option])\n )\n})\n\nconst dropdownRef = shallowRef<DropdownExposed>()\n\nlet internalChange = false\n\nwatch(\n [model, optionsMap],\n ([model, optionsMap]) => {\n if (internalChange) {\n internalChange = false\n return\n }\n checkedSet.clear()\n if (optionsMap.size && model?.length) {\n model.forEach((v) => {\n const option = optionsMap.get(v)\n option && checkedSet.add(option)\n })\n }\n },\n { immediate: true }\n)\n\nconst emitChange = () => {\n emit('change', Array.from(checkedSet))\n}\n\nconst tags = computed(() => {\n let tags: Record<string, any>[] = []\n let { visibilityLimit } = props\n if (visibilityLimit < 0) {\n visibilityLimit = 0\n }\n\n // 禁用时,显示全部\n if (disabled.value || readonly.value) {\n visibilityLimit = model.value?.length ?? 0\n }\n\n model.value?.slice(0, visibilityLimit).forEach((k) => {\n const option = optionsMap.value.get(k)\n option && tags.push(option)\n })\n\n return tags\n})\n\nconst restTag = computed(() => {\n return (model.value?.length ?? 0) - tags.value.length\n})\n\nconst dropdownVisible = shallowRef(false)\n\nconst inputRef = useTemplateRef<HTMLInputElement>('inputRef')\n\nconst handleDropdownVisible = (visible: boolean) => {\n dropdownVisible.value = visible\n if (!visible) {\n queryString.value = ''\n }\n}\n\n/**\n * 拦截输入区域的点击(@click.stop):阻止 dropdown 的 trigger 开合切换,\n * 保持面板展开以不中断输入。\n */\nconst handleInputClick = () => {\n if (!dropdownVisible.value) dropdownRef.value?.open()\n}\n\nconst handleInputFocus = () => {\n if (!dropdownVisible.value) dropdownRef.value?.open()\n}\n\n/** 勾选后把焦点还给输入框,便于连续输入过滤 */\nconst refocusInput = () => {\n if (!filterable.value) return\n nextTick(() => inputRef.value?.focus())\n}\n\nconst handleCheck = (option: Record<string, any>, checked: boolean) => {\n if (checked) {\n if (option.__isTemp && props.creatable) {\n const created: Record<string, any> = {\n [labelKey.value]: chainObj(option).get(labelKey.value),\n [valueKey.value]: chainObj(option).get(valueKey.value)\n }\n createdOptions.value = [...createdOptions.value, created]\n checkedSet.add(created)\n internalChange = true\n model.value = [...(model.value ?? []), chainObj(created).get(valueKey.value)!]\n queryString.value = ''\n } else if (!checkedSet.has(option)) {\n checkedSet.add(option)\n internalChange = true\n model.value = [...(model.value ?? []), chainObj(option).get(valueKey.value)!]\n }\n } else {\n checkedSet.delete(option)\n const val = chainObj(option).get(valueKey.value)\n internalChange = true\n model.value = (model.value ?? []).filter((v) => v !== val)\n removeCreatedOption(option)\n }\n\n emitChange()\n dropdownRef.value?.updateDropdown()\n refocusInput()\n}\n\n/** 全选 */\nconst handleCheckAll = (checked: boolean) => {\n if (checked) {\n options.value.forEach((option) => {\n if (!option.__isTemp) checkedSet.add(option)\n })\n internalChange = true\n model.value = Array.from(checkedSet).map((o) => chainObj(o).get(valueKey.value)!)\n } else {\n checkedSet.clear()\n internalChange = true\n model.value = []\n if (props.creatable) {\n createdOptions.value = []\n }\n }\n\n emitChange()\n dropdownRef.value?.updateDropdown()\n}\n\n/** 清除选项 */\nconst handleClear = () => {\n checkedSet.clear()\n internalChange = true\n model.value = []\n if (props.creatable) {\n createdOptions.value = []\n }\n emit('change', [])\n}\n\nconst handleClose = (option: Record<string, any>) => {\n checkedSet.delete(option)\n const val = chainObj(option).get(valueKey.value)\n internalChange = true\n model.value = (model.value ?? []).filter((v) => v !== val)\n removeCreatedOption(option)\n emitChange()\n}\n\nconst removeCreatedOption = (option: Record<string, any>) => {\n if (!props.creatable || !createdOptions.value.length) return\n const val = chainObj(option).get(valueKey.value)\n createdOptions.value = createdOptions.value.filter((o) => chainObj(o).get(valueKey.value) !== val)\n}\n\nconst handleCreateByEnter = () => {\n if (!props.creatable) return\n const qs = queryString.value?.trim()\n if (!qs) return\n\n const existingCreated = createdOptions.value.find((o) => chainObj(o).get(valueKey.value) === qs)\n if (existingCreated) {\n if (!checkedSet.has(existingCreated)) {\n checkedSet.add(existingCreated)\n internalChange = true\n model.value = [...(model.value ?? []), chainObj(existingCreated).get(valueKey.value)!]\n }\n queryString.value = ''\n emitChange()\n dropdownRef.value?.updateDropdown()\n return\n }\n\n const exactMatch = rawOptions.value.find(\n (o) => !o.__isTemp && chainObj(o).get(labelKey.value) === qs\n )\n if (exactMatch) {\n if (!checkedSet.has(exactMatch)) {\n checkedSet.add(exactMatch)\n internalChange = true\n model.value = [...(model.value ?? []), chainObj(exactMatch).get(valueKey.value)!]\n }\n queryString.value = ''\n emitChange()\n dropdownRef.value?.updateDropdown()\n return\n }\n\n const created: Record<string, any> = { [labelKey.value]: qs, [valueKey.value]: qs }\n createdOptions.value = [...createdOptions.value, created]\n checkedSet.add(created)\n internalChange = true\n model.value = [...(model.value ?? []), qs]\n queryString.value = ''\n emitChange()\n dropdownRef.value?.updateDropdown()\n}\n\nconst isDisabled = (option: Record<string, any>) => {\n const { max } = props\n return max !== undefined && checkedSet.size >= max && !checkedSet.has(option)\n}\n\nconst optionClass = cls.e('option')\nconst rippleClass = cls.e('ripple')\nconst checkboxClass = cls.e('checkbox')\n\nprovide(MultiSelectDIKey, { optionClass, rippleClass, checkboxClass })\n</script>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"multi-select.js","names":["$attrs","chainObj","o","_useModel","_unref","_openBlock","_createBlock","UDropdown","_mergeProps","_withCtx","_createElementBlock","_normalizeClass","_toDisplayString","_createCommentVNode","_Fragment","_renderList","UTag","_createTextVNode","_withDirectives","_isRef","_withModifiers","_withKeys","_vModelText","_createVNode","_Transition","UIcon","_createElementVNode","UCheckbox","ULoading","UScroll","UMultiSelectOption","_normalizeStyle","_renderSlot","UEmpty"],"sources":["../../../src/components/multi-select/multi-select.vue"],"sourcesContent":["<template>\n <u-dropdown\n v-if=\"!readonly\"\n v-bind=\"$attrs\"\n trigger=\"click\"\n ref=\"dropdownRef\"\n :class=\"[cls.b, cls.m(size), bem.is('disabled', disabled), bem.is('focus', dropdownVisible)]\"\n :content-class=\"[cls.e('panel'), cls.em('panel', size), contentClass]\"\n :content-style=\"contentStyle\"\n :min-width=\"minWidth\"\n :width=\"width\"\n @mouseenter=\"hovered = true\"\n @mouseleave=\"hovered = false\"\n :disabled=\"disabled\"\n @update:visible=\"handleDropdownVisible\"\n >\n <!-- 触发 -->\n <template #trigger>\n <span :class=\"cls.e('placeholder')\" v-if=\"!filterable && !model?.length\">\n {{ placeholder }}\n </span>\n\n <div v-if=\"model?.length || filterable\" :class=\"cls.e('tags')\">\n <u-tag\n v-for=\"option of tags\"\n :key=\"option[valueKey]\"\n :closable=\"!disabled\"\n size=\"small\"\n @close=\"handleClose(option)\"\n >\n {{ option[labelKey] }}\n </u-tag>\n <u-tag v-if=\"restTag\" size=\"small\"> {{ restTag }}+ </u-tag>\n\n <!-- 内嵌查询输入框:承载过滤与回车创建 -->\n <input\n v-if=\"filterable\"\n ref=\"inputRef\"\n :class=\"cls.e('input')\"\n v-model=\"queryString\"\n :placeholder=\"model?.length ? '' : placeholder\"\n :disabled=\"disabled\"\n @click.stop=\"handleInputClick\"\n @focus=\"handleInputFocus\"\n @keydown.enter.prevent=\"handleCreateByEnter\"\n />\n </div>\n\n <transition name=\"zoom-in\" mode=\"out-in\">\n <u-icon\n v-if=\"clearable && model?.length && hovered && !disabled\"\n :class=\"cls.e('clear')\"\n @click.stop=\"handleClear\"\n >\n <Close />\n </u-icon>\n\n <u-icon :class=\"cls.e('arrow')\" v-else><ArrowDown /></u-icon>\n </transition>\n </template>\n\n <!-- 下拉内容 -->\n <template #content>\n <!-- 多选栏 -->\n <div :class=\"cls.e('content-header')\">\n <u-checkbox\n :model-value=\"allChecked\"\n :indeterminate=\"indeterminate\"\n @update:model-value=\"handleCheckAll\"\n :disabled=\"max !== undefined\"\n >\n 全选\n </u-checkbox>\n\n <span> 已选 {{ model?.length }}/{{ max ?? options?.length ?? 0 }} </span>\n </div>\n\n <!-- 多选列表 -->\n <!--\n 虚拟化启用时内容容器 height 由 useVirtualizer 命令式写入;\n 模板不再绑定 totalSize,避免尺寸变化引起重渲染。\n -->\n <div v-if=\"loading\" :class=\"cls.e('loading')\">\n <ULoading type=\"dual-ring\" />\n </div>\n <u-scroll\n tag=\"ul\"\n :class=\"[cls.e('options')]\"\n ref=\"scrollRef\"\n v-else-if=\"options.length\"\n :content-class=\"[cls.e('options-wrap'), bem.is('virtual', virtualEnabled)]\"\n >\n <template v-if=\"virtualEnabled\">\n <u-multi-select-option\n v-for=\"{ option, index, key, label, offset } of virtualOptions\"\n :option=\"option\"\n :disabled=\"isDisabled(option)\"\n :key=\"key\"\n :style=\"{ transform: `translateY(${offset}px)` }\"\n @check=\"handleCheck(option, $event)\"\n :checked=\"checkedSet.has(option)\"\n :index=\"index\"\n :measure-element=\"measureElement\"\n >\n <slot v-bind=\"{ option, index }\">\n {{ label }}\n </slot>\n </u-multi-select-option>\n </template>\n\n <template v-else>\n <u-multi-select-option\n v-for=\"(option, index) of options\"\n :option=\"option\"\n :disabled=\"isDisabled(option)\"\n :key=\"chainObj(option).get(valueKey)\"\n @check=\"handleCheck(option, $event)\"\n :checked=\"checkedSet.has(option)\"\n >\n <slot v-bind=\"{ option, index }\">\n {{ chainObj(option).get(labelKey) }}\n </slot>\n </u-multi-select-option>\n </template>\n </u-scroll>\n\n <div v-else :class=\"cls.e('empty')\">\n <UEmpty />\n </div>\n </template>\n </u-dropdown>\n\n <div v-else-if=\"model?.length\" :class=\"[cls.m(size), cls.e('readonly-tags')]\">\n <div :class=\"cls.e('tags')\">\n <u-tag v-for=\"option of tags\" :key=\"option[valueKey]\" size=\"small\">\n {{ option[labelKey] }}\n </u-tag>\n </div>\n </div>\n\n <template v-else>\n {{ FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { o as chainObj } from '@cat-kit/core'\nimport { useFormFallbackProps, useVirtualizer } from '@veltra/compositions'\nimport { ArrowDown, Close } from '@veltra/icons/normal'\nimport { bem, fieldKey, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport {\n computed,\n nextTick,\n shallowRef,\n shallowReactive,\n watch,\n provide,\n useTemplateRef\n} from 'vue'\n\nimport type {\n MultiSelectEmits,\n MultiSelectProps,\n ScrollExposed,\n DropdownExposed\n} from '../../types'\nimport { UCheckbox } from '../checkbox'\nimport { UDropdown } from '../dropdown'\nimport { UEmpty } from '../empty'\nimport { UIcon } from '../icon'\nimport { ULoading } from '../loading'\nimport { UScroll } from '../scroll'\nimport { useOptions } from '../select/use-options'\nimport { UTag } from '../tag'\nimport { MultiSelectDIKey } from './di'\nimport UMultiSelectOption from './multi-select-option.vue'\n\ndefineOptions({ name: 'UMultiSelect', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<MultiSelectProps>(), {\n labelKey: 'label',\n valueKey: 'value',\n placeholder: '请选择',\n clearable: true,\n visibilityLimit: 3,\n disabled: undefined,\n readonly: undefined,\n minWidth: '220px'\n})\n\nconst emit = defineEmits<MultiSelectEmits>()\n\nconst cls = bem('multi-select')\n\nconst labelKey = computed(() => fieldKey(props.labelKey, 'label'))\nconst valueKey = computed(() => fieldKey(props.valueKey, 'value'))\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\nconst scrollRef = shallowRef<ScrollExposed>()\n\nconst hovered = shallowRef(false)\n\nconst {\n options: rawOptions,\n queryString,\n loading,\n allOptions: rawAllOptions\n} = useOptions({ props })\n\nconst createdOptions = shallowRef<Record<string, any>[]>([])\n\nconst options = computed(() => {\n const base = rawOptions.value\n if (!props.creatable || !createdOptions.value.length) return base\n\n const createdValues = new Set(createdOptions.value.map((o) => chainObj(o).get(valueKey.value)))\n const deduped = base.filter(\n (o) => !(o.__isTemp && createdValues.has(chainObj(o).get(valueKey.value)))\n )\n const dedupedValues = new Set(deduped.map((o) => chainObj(o).get(valueKey.value)))\n const toAdd = createdOptions.value.filter(\n (o) => !dedupedValues.has(chainObj(o).get(valueKey.value))\n )\n return [...toAdd, ...deduped]\n})\n\nconst allOptions = computed(() => {\n if (!props.creatable || !createdOptions.value.length) return rawAllOptions.value\n return [...createdOptions.value, ...rawAllOptions.value]\n})\n\nconst virtualEnabled = computed(() => options.value.length > 80)\n\nconst { virtualizer, items } = useVirtualizer({\n estimateSize: () => 40,\n count: computed(() => options.value.length),\n scrollEl: () => scrollRef.value?.containerRef ?? null,\n contentEl: () => (virtualEnabled.value ? (scrollRef.value?.contentRef ?? null) : null)\n})\n\nconst virtualOptions = computed(() => {\n const _options = options.value\n return items.value.map((v) => {\n const option = _options[v.index]!\n const val = chainObj(option).get(valueKey.value)\n return {\n option,\n index: v.index,\n val,\n key: v.index,\n offset: v.start,\n label: chainObj(option).get(labelKey.value)\n }\n })\n})\n\nconst measureElement: (index: number, el: Element | null) => void = (index, el) =>\n virtualizer.measureElement(index, el)\n\nconst filterable = computed(() => {\n return props.filterable || props.creatable || typeof props.options === 'function'\n})\n\nconst model = defineModel<Array<string | number>>()\n\nconst checkedSet = shallowReactive<Set<Record<string, any>>>(new Set())\nconst allChecked = computed(() => {\n return checkedSet.size === options.value.length\n})\nconst indeterminate = computed(() => {\n return checkedSet.size > 0 && !allChecked.value\n})\n\nconst optionsMap = computed(() => {\n return new Map<string | number, Record<string, any>>(\n allOptions.value.map((option) => [option[valueKey.value], option])\n )\n})\n\nconst dropdownRef = shallowRef<DropdownExposed>()\n\nlet internalChange = false\n\nwatch(\n [model, optionsMap],\n ([model, optionsMap]) => {\n if (internalChange) {\n internalChange = false\n return\n }\n checkedSet.clear()\n if (optionsMap.size && model?.length) {\n model.forEach((v) => {\n const option = optionsMap.get(v)\n option && checkedSet.add(option)\n })\n }\n },\n { immediate: true }\n)\n\nconst emitChange = () => {\n emit('change', Array.from(checkedSet))\n}\n\nconst tags = computed(() => {\n let tags: Record<string, any>[] = []\n let { visibilityLimit } = props\n if (visibilityLimit < 0) {\n visibilityLimit = 0\n }\n\n // 禁用时,显示全部\n if (disabled.value || readonly.value) {\n visibilityLimit = model.value?.length ?? 0\n }\n\n model.value?.slice(0, visibilityLimit).forEach((k) => {\n const option = optionsMap.value.get(k)\n option && tags.push(option)\n })\n\n return tags\n})\n\nconst restTag = computed(() => {\n return (model.value?.length ?? 0) - tags.value.length\n})\n\nconst dropdownVisible = shallowRef(false)\n\nconst inputRef = useTemplateRef<HTMLInputElement>('inputRef')\n\nconst handleDropdownVisible = (visible: boolean) => {\n dropdownVisible.value = visible\n if (!visible) {\n queryString.value = ''\n }\n}\n\n/**\n * 拦截输入区域的点击(@click.stop):阻止 dropdown 的 trigger 开合切换,\n * 保持面板展开以不中断输入。\n */\nconst handleInputClick = () => {\n if (!dropdownVisible.value) dropdownRef.value?.open()\n}\n\nconst handleInputFocus = () => {\n if (!dropdownVisible.value) dropdownRef.value?.open()\n}\n\n/** 勾选后把焦点还给输入框,便于连续输入过滤 */\nconst refocusInput = () => {\n if (!filterable.value) return\n nextTick(() => inputRef.value?.focus())\n}\n\nconst handleCheck = (option: Record<string, any>, checked: boolean) => {\n if (checked) {\n if (option.__isTemp && props.creatable) {\n const created: Record<string, any> = {\n [labelKey.value]: chainObj(option).get(labelKey.value),\n [valueKey.value]: chainObj(option).get(valueKey.value)\n }\n createdOptions.value = [...createdOptions.value, created]\n checkedSet.add(created)\n internalChange = true\n model.value = [...(model.value ?? []), chainObj(created).get(valueKey.value)!]\n queryString.value = ''\n } else if (!checkedSet.has(option)) {\n checkedSet.add(option)\n internalChange = true\n model.value = [...(model.value ?? []), chainObj(option).get(valueKey.value)!]\n }\n } else {\n checkedSet.delete(option)\n const val = chainObj(option).get(valueKey.value)\n internalChange = true\n model.value = (model.value ?? []).filter((v) => v !== val)\n removeCreatedOption(option)\n }\n\n emitChange()\n dropdownRef.value?.updateDropdown()\n refocusInput()\n}\n\n/** 全选 */\nconst handleCheckAll = (checked: boolean) => {\n if (checked) {\n options.value.forEach((option) => {\n if (!option.__isTemp) checkedSet.add(option)\n })\n internalChange = true\n model.value = Array.from(checkedSet).map((o) => chainObj(o).get(valueKey.value)!)\n } else {\n checkedSet.clear()\n internalChange = true\n model.value = []\n if (props.creatable) {\n createdOptions.value = []\n }\n }\n\n emitChange()\n dropdownRef.value?.updateDropdown()\n}\n\n/** 清除选项 */\nconst handleClear = () => {\n checkedSet.clear()\n internalChange = true\n model.value = []\n if (props.creatable) {\n createdOptions.value = []\n }\n emit('change', [])\n}\n\nconst handleClose = (option: Record<string, any>) => {\n checkedSet.delete(option)\n const val = chainObj(option).get(valueKey.value)\n internalChange = true\n model.value = (model.value ?? []).filter((v) => v !== val)\n removeCreatedOption(option)\n emitChange()\n}\n\nconst removeCreatedOption = (option: Record<string, any>) => {\n if (!props.creatable || !createdOptions.value.length) return\n const val = chainObj(option).get(valueKey.value)\n createdOptions.value = createdOptions.value.filter((o) => chainObj(o).get(valueKey.value) !== val)\n}\n\nconst handleCreateByEnter = () => {\n if (!props.creatable) return\n const qs = queryString.value?.trim()\n if (!qs) return\n\n const existingCreated = createdOptions.value.find((o) => chainObj(o).get(valueKey.value) === qs)\n if (existingCreated) {\n if (!checkedSet.has(existingCreated)) {\n checkedSet.add(existingCreated)\n internalChange = true\n model.value = [...(model.value ?? []), chainObj(existingCreated).get(valueKey.value)!]\n }\n queryString.value = ''\n emitChange()\n dropdownRef.value?.updateDropdown()\n return\n }\n\n const exactMatch = rawOptions.value.find(\n (o) => !o.__isTemp && chainObj(o).get(labelKey.value) === qs\n )\n if (exactMatch) {\n if (!checkedSet.has(exactMatch)) {\n checkedSet.add(exactMatch)\n internalChange = true\n model.value = [...(model.value ?? []), chainObj(exactMatch).get(valueKey.value)!]\n }\n queryString.value = ''\n emitChange()\n dropdownRef.value?.updateDropdown()\n return\n }\n\n const created: Record<string, any> = { [labelKey.value]: qs, [valueKey.value]: qs }\n createdOptions.value = [...createdOptions.value, created]\n checkedSet.add(created)\n internalChange = true\n model.value = [...(model.value ?? []), qs]\n queryString.value = ''\n emitChange()\n dropdownRef.value?.updateDropdown()\n}\n\nconst isDisabled = (option: Record<string, any>) => {\n const { max } = props\n return max !== undefined && checkedSet.size >= max && !checkedSet.has(option)\n}\n\nconst optionClass = cls.e('option')\nconst rippleClass = cls.e('ripple')\nconst checkboxClass = cls.e('checkbox')\n\nprovide(MultiSelectDIKey, { optionClass, rippleClass, checkboxClass })\n</script>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multi-tree-select.js","names":["$attrs"],"sources":["../../../src/components/multi-tree-select/multi-tree-select.vue"],"sourcesContent":["<template>\n <u-dropdown\n v-if=\"!readonly\"\n v-bind=\"$attrs\"\n :class=\"[cls.b, cls.m(size), bem.is('disabled', disabled), bem.is('focus', dropdownVisible)]\"\n trigger=\"click\"\n :content-class=\"[cls.e('panel'), cls.em('panel', size), contentClass]\"\n :content-style=\"contentStyle\"\n :disabled=\"disabled\"\n @mouseenter=\"hovered = true\"\n @mouseleave=\"hovered = false\"\n ref=\"dropdownRef\"\n :min-width=\"minWidth\"\n :width=\"width\"\n @update:visible=\"handleDropdownVisible\"\n >\n <template #trigger>\n <!-- 默认展示 -->\n <span :class=\"cls.e('placeholder')\" v-if=\"!filterable && !tags.length\">\n {{ placeholder }}\n </span>\n\n <!-- 选择的数据项 -->\n <div v-if=\"tags.length || filterable\" :class=\"cls.e('tags')\">\n <u-tag\n v-for=\"(tag, index) in visibleTags\"\n :key=\"tag[valueKey]\"\n :closable=\"!disabled\"\n @close=\"handleRemove(index)\"\n >\n {{ tag[labelKey] }}\n </u-tag>\n <u-tag v-if=\"hiddenCount > 0\">+{{ hiddenCount }}</u-tag>\n\n <!-- 内嵌查询输入框:承载过滤 -->\n <input\n v-if=\"filterable\"\n ref=\"inputRef\"\n :class=\"cls.e('input')\"\n v-model=\"qs\"\n :placeholder=\"tags.length ? '' : placeholder\"\n :disabled=\"disabled\"\n @click.stop=\"handleInputClick\"\n @focus=\"handleInputFocus\"\n />\n </div>\n <!-- 清空 icon -->\n <transition name=\"zoom-in\" mode=\"out-in\">\n <u-icon v-if=\"showClear\" :class=\"cls.e('clear')\" @click.stop=\"handleClear\">\n <Close />\n </u-icon>\n\n <!-- 下拉 icon -->\n <u-icon :class=\"cls.e(`arrow`)\" v-else-if=\"!readonly\">\n <ArrowDown />\n </u-icon>\n </transition>\n </template>\n <template #content>\n <div :class=\"[cls.e('content-header'), cls.m(size)]\">\n <!-- 全选 -->\n <u-checkbox\n :model-value=\"allChecked\"\n :indeterminate=\"indeterminate\"\n @update:model-value=\"handleCheckAll\"\n >\n 全选\n </u-checkbox>\n\n <u-button size=\"small\" text type=\"primary\" @click=\"handleToggleExpandAll\">\n {{ allExpanded ? '收起全部' : '展开全部' }}\n </u-button>\n </div>\n <div v-if=\"remoteLoading\" :class=\"cls.e('loading')\">\n <ULoading type=\"dual-ring\" />\n </div>\n <!-- 菜单列表 -->\n <u-tree\n v-else\n v-bind=\"treeProps\"\n v-model:checked=\"model\"\n @update:checked=\"handleCheck\"\n ref=\"treeRef\"\n :class=\"cls.e('content-tree')\"\n checkable\n :data=\"treeData\"\n :slots=\"slots\"\n scroll-to-view\n ></u-tree>\n </template>\n </u-dropdown>\n\n <div v-else-if=\"model.length\" :class=\"[cls.m(size), cls.e('readonly-tags')]\">\n <div :class=\"cls.e('tags')\">\n <u-tag v-for=\"option of tags\" :key=\"option[valueKey]\">\n {{ option[labelKey] }}\n </u-tag>\n </div>\n </div>\n\n <template v-else>\n {{ FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { debounce, dfs, o } from '@cat-kit/core'\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { ArrowDown, Close } from '@veltra/icons/normal'\nimport { bem, fieldKey, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed, nextTick, shallowRef, useTemplateRef, watch } from 'vue'\n\nimport type { MultiTreeSelectProps, MultiTreeSelectEmits, TreeExposed } from '../../types'\nimport type { DropdownExposed } from '../../types'\nimport { UButton } from '../button'\nimport { UCheckbox } from '../checkbox'\nimport { UDropdown } from '../dropdown'\nimport { UIcon } from '../icon'\nimport { ULoading } from '../loading'\nimport { UTag } from '../tag'\nimport { UTree } from '../tree'\nimport type { TreeSlotsScope } from '../tree/di'\n\ndefineOptions({ name: 'UMultiTreeSelect', inheritAttrs: false })\n\nconst cls = bem('multi-tree-select')\n\nconst props = withDefaults(defineProps<MultiTreeSelectProps>(), {\n labelKey: 'label',\n valueKey: 'value',\n placeholder: '请选择',\n expandAll: false,\n clearable: true,\n disabled: undefined,\n readonly: undefined,\n filterable: false,\n visibilityLimit: 3,\n minWidth: '280px',\n checkStrictly: false,\n checkOnClickNode: true\n})\n\nconst labelKey = computed(() => fieldKey(props.labelKey, 'label'))\nconst valueKey = computed(() => fieldKey(props.valueKey, 'value'))\n\nconst treeProps = computed(() => {\n return o(props as Record<string, any>).omit([\n 'tips',\n 'field',\n 'placeholder',\n 'disabled',\n 'label',\n 'readonly',\n 'modelValue',\n 'data',\n 'contentClass',\n 'contentStyle',\n 'minWidth',\n 'width'\n ])\n})\n\nconst emit = defineEmits<MultiTreeSelectEmits>()\n\nconst slots = defineSlots<{ default?: (props: TreeSlotsScope) => any }>()\n\n/** 是否可搜索:显式声明或数据源为远程函数 */\nconst filterable = computed(() => props.filterable || typeof props.data === 'function')\n\n/** 过滤 */\nconst qs = shallowRef('')\n\nconst treeRef = shallowRef<TreeExposed>()\n\n/** 远程搜索返回的树数据 */\nconst remoteData = shallowRef<Record<string, any>[]>()\n\n/** 面板渲染的树数据:data 为函数时来自远程搜索,否则为静态数据 */\nconst treeData = computed(() => (typeof props.data === 'function' ? remoteData.value : props.data))\n\nconst remoteLoading = shallowRef(false)\n/** 远程请求序号;响应返回时序号不一致说明已有更新的请求,结果作废 */\nlet remoteSeq = 0\n\nconst debouncedRemoteSearch = debounce(\n async (\n query: string,\n dataFn: (qs: string) => Promise<Record<string, any>[]> | Record<string, any>[]\n ) => {\n const seq = ++remoteSeq\n remoteLoading.value = true\n try {\n const data = await dataFn(query)\n // 响应到达时查询词可能已变化或已有更新的请求,过期结果直接丢弃\n if (seq !== remoteSeq || query !== qs.value) return\n remoteData.value = data ?? []\n // 搜索结果展示完整命中路径,与本地过滤自动展开祖先的行为对齐\n if (query) nextTick(() => treeRef.value?.expandAll())\n } finally {\n if (seq === remoteSeq) remoteLoading.value = false\n }\n },\n 200\n)\n\nwatch(\n [qs, () => props.data],\n ([query, data]) => {\n if (typeof data === 'function') {\n debouncedRemoteSearch(query, data)\n return\n }\n treeRef.value?.filter(query)\n },\n { immediate: true }\n)\n\nconst model = defineModel<(string | number)[]>({ default: () => [] })\n\nconst hovered = shallowRef(false)\n\nconst tags = shallowRef<Record<string, any>[]>([])\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props])\n\nconst showClear = computed(() => {\n return props.clearable && model.value?.length && hovered.value && !disabled.value\n})\n\nconst dropdownRef = shallowRef<DropdownExposed>()\n\nlet changedByEvent = false\n\nfunction markEvent() {\n changedByEvent = true\n nextTick(() => {\n changedByEvent = false\n })\n}\n\n/**是否全选 */\nconst allChecked = computed(() => {\n return model.value?.length === treeRef.value?.forest.size\n})\n\n/**部分 */\nconst indeterminate = computed(() => {\n return model.value.length! > 0 && !allChecked.value\n})\n\n/** 全选*/\nconst handleCheckAll = (checked: boolean) => {\n treeRef.value?.checkAll(checked)\n\n dropdownRef.value?.updateDropdown()\n}\n\n/**选中 */\nconst handleCheck = (checked: (string | number)[], checkedData: Record<string, any>[]) => {\n markEvent()\n tags.value = checkedData\n emit('change', checkedData!)\n\n dropdownRef.value?.updateDropdown()\n}\n\n/**删除 */\nconst handleRemove = (index: number) => {\n markEvent()\n tags.value = tags.value.filter((_, i) => i !== index)\n model.value = model.value.filter((_, i) => i !== index)\n emit('change', tags.value)\n}\n\n/**清空 */\nconst handleClear = () => {\n markEvent()\n tags.value = []\n model.value = []\n emit('clear')\n}\n\nconst keyDicts = shallowRef(new Map<string | number, Record<string, any>>())\n\nwatch(\n treeData,\n (data) => {\n if (!data?.length) {\n keyDicts.value = new Map()\n } else {\n const newDict = new Map()\n data.forEach((item) => {\n dfs(\n item,\n (v) => {\n newDict.set(v[valueKey.value], v)\n },\n props.childrenKey\n )\n })\n keyDicts.value = newDict\n }\n },\n { immediate: true }\n)\n\nwatch(\n [keyDicts, model],\n ([keyDicts, model]) => {\n if (changedByEvent) return\n\n if (!keyDicts.size || !model?.length) {\n tags.value = []\n return\n }\n\n tags.value = model.filter((v) => keyDicts.has(v)).map((v) => keyDicts.get(v)!)\n },\n { immediate: true }\n)\n\nconst allExpanded = shallowRef(props.expandAll)\nfunction handleToggleExpandAll() {\n allExpanded.value = !allExpanded.value\n allExpanded.value ? treeRef.value?.expandAll() : treeRef.value?.collapseAll()\n}\n\nwatch(treeRef, (treeRef) => {\n if (!treeRef) {\n allExpanded.value = props.expandAll\n }\n})\n\nconst limit = () => {\n let { visibilityLimit } = props\n\n if (visibilityLimit < 0) {\n visibilityLimit = 0\n }\n if (disabled.value || readonly.value) {\n visibilityLimit = model.value?.length ?? 0\n }\n return visibilityLimit\n}\n\nconst visibleTags = computed(() => {\n if (tags.value.length > limit()) {\n return tags.value.slice(0, limit())\n }\n return tags.value\n})\n\nconst hiddenCount = computed(() => {\n if (tags.value.length > limit()) {\n return tags.value.length - limit()\n }\n return 0\n})\n\nconst dropdownVisible = shallowRef(false)\n\nconst inputRef = useTemplateRef<HTMLInputElement>('inputRef')\n\nconst handleDropdownVisible = (visible: boolean) => {\n dropdownVisible.value = visible\n if (!visible) {\n qs.value = ''\n }\n}\n\n/**\n * 拦截输入区域的点击(@click.stop):阻止 dropdown 的 trigger 开合切换,\n * 保持面板展开以不中断输入。\n */\nconst handleInputClick = () => {\n if (!dropdownVisible.value) dropdownRef.value?.open()\n}\n\nconst handleInputFocus = () => {\n if (!dropdownVisible.value) dropdownRef.value?.open()\n}\n</script>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"multi-tree-select.js","names":["$attrs","_useSlots","_useModel","_unref","_openBlock","_createBlock","UDropdown","_mergeProps","_withCtx","_createCommentVNode","_createElementBlock","_normalizeClass","_toDisplayString","_Fragment","_renderList","UTag","_createTextVNode","_withDirectives","_withModifiers","_vModelText","_createVNode","_Transition","UIcon","_createElementVNode","UCheckbox","UButton","ULoading","UTree"],"sources":["../../../src/components/multi-tree-select/multi-tree-select.vue"],"sourcesContent":["<template>\n <u-dropdown\n v-if=\"!readonly\"\n v-bind=\"$attrs\"\n :class=\"[cls.b, cls.m(size), bem.is('disabled', disabled), bem.is('focus', dropdownVisible)]\"\n trigger=\"click\"\n :content-class=\"[cls.e('panel'), cls.em('panel', size), contentClass]\"\n :content-style=\"contentStyle\"\n :disabled=\"disabled\"\n @mouseenter=\"hovered = true\"\n @mouseleave=\"hovered = false\"\n ref=\"dropdownRef\"\n :min-width=\"minWidth\"\n :width=\"width\"\n @update:visible=\"handleDropdownVisible\"\n >\n <template #trigger>\n <!-- 默认展示 -->\n <span :class=\"cls.e('placeholder')\" v-if=\"!filterable && !tags.length\">\n {{ placeholder }}\n </span>\n\n <!-- 选择的数据项 -->\n <div v-if=\"tags.length || filterable\" :class=\"cls.e('tags')\">\n <u-tag\n v-for=\"(tag, index) in visibleTags\"\n :key=\"tag[valueKey]\"\n :closable=\"!disabled\"\n @close=\"handleRemove(index)\"\n >\n {{ tag[labelKey] }}\n </u-tag>\n <u-tag v-if=\"hiddenCount > 0\">+{{ hiddenCount }}</u-tag>\n\n <!-- 内嵌查询输入框:承载过滤 -->\n <input\n v-if=\"filterable\"\n ref=\"inputRef\"\n :class=\"cls.e('input')\"\n v-model=\"qs\"\n :placeholder=\"tags.length ? '' : placeholder\"\n :disabled=\"disabled\"\n @click.stop=\"handleInputClick\"\n @focus=\"handleInputFocus\"\n />\n </div>\n <!-- 清空 icon -->\n <transition name=\"zoom-in\" mode=\"out-in\">\n <u-icon v-if=\"showClear\" :class=\"cls.e('clear')\" @click.stop=\"handleClear\">\n <Close />\n </u-icon>\n\n <!-- 下拉 icon -->\n <u-icon :class=\"cls.e(`arrow`)\" v-else-if=\"!readonly\">\n <ArrowDown />\n </u-icon>\n </transition>\n </template>\n <template #content>\n <div :class=\"[cls.e('content-header'), cls.m(size)]\">\n <!-- 全选 -->\n <u-checkbox\n :model-value=\"allChecked\"\n :indeterminate=\"indeterminate\"\n @update:model-value=\"handleCheckAll\"\n >\n 全选\n </u-checkbox>\n\n <u-button size=\"small\" text type=\"primary\" @click=\"handleToggleExpandAll\">\n {{ allExpanded ? '收起全部' : '展开全部' }}\n </u-button>\n </div>\n <div v-if=\"remoteLoading\" :class=\"cls.e('loading')\">\n <ULoading type=\"dual-ring\" />\n </div>\n <!-- 菜单列表 -->\n <u-tree\n v-else\n v-bind=\"treeProps\"\n v-model:checked=\"model\"\n @update:checked=\"handleCheck\"\n ref=\"treeRef\"\n :class=\"cls.e('content-tree')\"\n checkable\n :data=\"treeData\"\n :slots=\"slots\"\n scroll-to-view\n ></u-tree>\n </template>\n </u-dropdown>\n\n <div v-else-if=\"model.length\" :class=\"[cls.m(size), cls.e('readonly-tags')]\">\n <div :class=\"cls.e('tags')\">\n <u-tag v-for=\"option of tags\" :key=\"option[valueKey]\">\n {{ option[labelKey] }}\n </u-tag>\n </div>\n </div>\n\n <template v-else>\n {{ FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { debounce, dfs, o } from '@cat-kit/core'\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { ArrowDown, Close } from '@veltra/icons/normal'\nimport { bem, fieldKey, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed, nextTick, shallowRef, useTemplateRef, watch } from 'vue'\n\nimport type { MultiTreeSelectProps, MultiTreeSelectEmits, TreeExposed } from '../../types'\nimport type { DropdownExposed } from '../../types'\nimport { UButton } from '../button'\nimport { UCheckbox } from '../checkbox'\nimport { UDropdown } from '../dropdown'\nimport { UIcon } from '../icon'\nimport { ULoading } from '../loading'\nimport { UTag } from '../tag'\nimport { UTree } from '../tree'\nimport type { TreeSlotsScope } from '../tree/di'\n\ndefineOptions({ name: 'UMultiTreeSelect', inheritAttrs: false })\n\nconst cls = bem('multi-tree-select')\n\nconst props = withDefaults(defineProps<MultiTreeSelectProps>(), {\n labelKey: 'label',\n valueKey: 'value',\n placeholder: '请选择',\n expandAll: false,\n clearable: true,\n disabled: undefined,\n readonly: undefined,\n filterable: false,\n visibilityLimit: 3,\n minWidth: '280px',\n checkStrictly: false,\n checkOnClickNode: true\n})\n\nconst labelKey = computed(() => fieldKey(props.labelKey, 'label'))\nconst valueKey = computed(() => fieldKey(props.valueKey, 'value'))\n\nconst treeProps = computed(() => {\n return o(props as Record<string, any>).omit([\n 'tips',\n 'field',\n 'placeholder',\n 'disabled',\n 'label',\n 'readonly',\n 'modelValue',\n 'data',\n 'contentClass',\n 'contentStyle',\n 'minWidth',\n 'width'\n ])\n})\n\nconst emit = defineEmits<MultiTreeSelectEmits>()\n\nconst slots = defineSlots<{ default?: (props: TreeSlotsScope) => any }>()\n\n/** 是否可搜索:显式声明或数据源为远程函数 */\nconst filterable = computed(() => props.filterable || typeof props.data === 'function')\n\n/** 过滤 */\nconst qs = shallowRef('')\n\nconst treeRef = shallowRef<TreeExposed>()\n\n/** 远程搜索返回的树数据 */\nconst remoteData = shallowRef<Record<string, any>[]>()\n\n/** 面板渲染的树数据:data 为函数时来自远程搜索,否则为静态数据 */\nconst treeData = computed(() => (typeof props.data === 'function' ? remoteData.value : props.data))\n\nconst remoteLoading = shallowRef(false)\n/** 远程请求序号;响应返回时序号不一致说明已有更新的请求,结果作废 */\nlet remoteSeq = 0\n\nconst debouncedRemoteSearch = debounce(\n async (\n query: string,\n dataFn: (qs: string) => Promise<Record<string, any>[]> | Record<string, any>[]\n ) => {\n const seq = ++remoteSeq\n remoteLoading.value = true\n try {\n const data = await dataFn(query)\n // 响应到达时查询词可能已变化或已有更新的请求,过期结果直接丢弃\n if (seq !== remoteSeq || query !== qs.value) return\n remoteData.value = data ?? []\n // 搜索结果展示完整命中路径,与本地过滤自动展开祖先的行为对齐\n if (query) nextTick(() => treeRef.value?.expandAll())\n } finally {\n if (seq === remoteSeq) remoteLoading.value = false\n }\n },\n 200\n)\n\nwatch(\n [qs, () => props.data],\n ([query, data]) => {\n if (typeof data === 'function') {\n debouncedRemoteSearch(query, data)\n return\n }\n treeRef.value?.filter(query)\n },\n { immediate: true }\n)\n\nconst model = defineModel<(string | number)[]>({ default: () => [] })\n\nconst hovered = shallowRef(false)\n\nconst tags = shallowRef<Record<string, any>[]>([])\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props])\n\nconst showClear = computed(() => {\n return props.clearable && model.value?.length && hovered.value && !disabled.value\n})\n\nconst dropdownRef = shallowRef<DropdownExposed>()\n\nlet changedByEvent = false\n\nfunction markEvent() {\n changedByEvent = true\n nextTick(() => {\n changedByEvent = false\n })\n}\n\n/**是否全选 */\nconst allChecked = computed(() => {\n return model.value?.length === treeRef.value?.forest.size\n})\n\n/**部分 */\nconst indeterminate = computed(() => {\n return model.value.length! > 0 && !allChecked.value\n})\n\n/** 全选*/\nconst handleCheckAll = (checked: boolean) => {\n treeRef.value?.checkAll(checked)\n\n dropdownRef.value?.updateDropdown()\n}\n\n/**选中 */\nconst handleCheck = (checked: (string | number)[], checkedData: Record<string, any>[]) => {\n markEvent()\n tags.value = checkedData\n emit('change', checkedData!)\n\n dropdownRef.value?.updateDropdown()\n}\n\n/**删除 */\nconst handleRemove = (index: number) => {\n markEvent()\n tags.value = tags.value.filter((_, i) => i !== index)\n model.value = model.value.filter((_, i) => i !== index)\n emit('change', tags.value)\n}\n\n/**清空 */\nconst handleClear = () => {\n markEvent()\n tags.value = []\n model.value = []\n emit('clear')\n}\n\nconst keyDicts = shallowRef(new Map<string | number, Record<string, any>>())\n\nwatch(\n treeData,\n (data) => {\n if (!data?.length) {\n keyDicts.value = new Map()\n } else {\n const newDict = new Map()\n data.forEach((item) => {\n dfs(\n item,\n (v) => {\n newDict.set(v[valueKey.value], v)\n },\n props.childrenKey\n )\n })\n keyDicts.value = newDict\n }\n },\n { immediate: true }\n)\n\nwatch(\n [keyDicts, model],\n ([keyDicts, model]) => {\n if (changedByEvent) return\n\n if (!keyDicts.size || !model?.length) {\n tags.value = []\n return\n }\n\n tags.value = model.filter((v) => keyDicts.has(v)).map((v) => keyDicts.get(v)!)\n },\n { immediate: true }\n)\n\nconst allExpanded = shallowRef(props.expandAll)\nfunction handleToggleExpandAll() {\n allExpanded.value = !allExpanded.value\n allExpanded.value ? treeRef.value?.expandAll() : treeRef.value?.collapseAll()\n}\n\nwatch(treeRef, (treeRef) => {\n if (!treeRef) {\n allExpanded.value = props.expandAll\n }\n})\n\nconst limit = () => {\n let { visibilityLimit } = props\n\n if (visibilityLimit < 0) {\n visibilityLimit = 0\n }\n if (disabled.value || readonly.value) {\n visibilityLimit = model.value?.length ?? 0\n }\n return visibilityLimit\n}\n\nconst visibleTags = computed(() => {\n if (tags.value.length > limit()) {\n return tags.value.slice(0, limit())\n }\n return tags.value\n})\n\nconst hiddenCount = computed(() => {\n if (tags.value.length > limit()) {\n return tags.value.length - limit()\n }\n return 0\n})\n\nconst dropdownVisible = shallowRef(false)\n\nconst inputRef = useTemplateRef<HTMLInputElement>('inputRef')\n\nconst handleDropdownVisible = (visible: boolean) => {\n dropdownVisible.value = visible\n if (!visible) {\n qs.value = ''\n }\n}\n\n/**\n * 拦截输入区域的点击(@click.stop):阻止 dropdown 的 trigger 开合切换,\n * 保持面板展开以不中断输入。\n */\nconst handleInputClick = () => {\n if (!dropdownVisible.value) dropdownRef.value?.open()\n}\n\nconst handleInputFocus = () => {\n if (!dropdownVisible.value) dropdownRef.value?.open()\n}\n</script>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nav-icon.js","names":[],"sources":["../../../src/components/nav/nav-icon.vue"],"sourcesContent":["<template>\n <u-icon v-if=\"typeof icon !== 'string'\">\n <component :is=\"icon\" />\n </u-icon>\n\n <img :src=\"icon\" v-else alt=\"icon\" />\n</template>\n\n<script lang=\"ts\" setup>\nimport type { DefineComponent } from 'vue'\n\nimport { UIcon } from '../icon'\n\ndefineOptions({ name: 'UNavIcon' })\n\ndefineProps<{ icon: string | DefineComponent }>()\n</script>\n"],"mappings":";;;;;;;;;;GACuB,OAAA,OAAA,QAAA,SAAI,
|
|
1
|
+
{"version":3,"file":"nav-icon.js","names":["_openBlock","_createBlock","_unref","UIcon","_withCtx","_resolveDynamicComponent","_createElementBlock"],"sources":["../../../src/components/nav/nav-icon.vue"],"sourcesContent":["<template>\n <u-icon v-if=\"typeof icon !== 'string'\">\n <component :is=\"icon\" />\n </u-icon>\n\n <img :src=\"icon\" v-else alt=\"icon\" />\n</template>\n\n<script lang=\"ts\" setup>\nimport type { DefineComponent } from 'vue'\n\nimport { UIcon } from '../icon'\n\ndefineOptions({ name: 'UNavIcon' })\n\ndefineProps<{ icon: string | DefineComponent }>()\n</script>\n"],"mappings":";;;;;;;;;;GACuB,OAAA,OAAA,QAAA,SAAI,YAAzBA,UAAA,GAAAC,YAESC,MAAAC,WAAA,GAAA,EAAA,KAAA,EAAA,GAAA;IADP,SAAAC,cAAwB,EAAxBJ,UAAA,GAAAC,YAAwBI,wBAAR,QAAA,IAAI,CAAA,EAAA,CAAA;;GAGtB,CAAA,MAAAL,UAAA,GAAAM,mBAAqC,OAAA;;IAA/B,KAAK,QAAA;IAAa,KAAI"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nav-item-collapsed.js","names":[],"sources":["../../../src/components/nav/nav-item-collapsed.vue"],"sourcesContent":["<template>\n <!-- 一级导航 -->\n <u-tip v-if=\"depth === 0\" direction=\"right\" hide-arrow>\n <li\n :class=\"[\n collapsedCls.e('item'),\n bem.is('active', active),\n bem.is('first-level'),\n bem.is('disabled', item.disabled ?? false)\n ]\"\n ref=\"item\"\n @click=\"handleClickItem\"\n >\n <UNavIcon v-if=\"item.icon\" :icon=\"item.icon\" :class=\"collapsedCls.e('icon')\" />\n <span v-else>{{ item.title[0] }}</span>\n </li>\n\n <template #content>\n {{ item.title }}\n </template>\n </u-tip>\n\n <!-- 二级以及二级以下导航 -->\n <li\n v-else\n :class=\"[\n collapsedCls.e('item'),\n bem.is('active', active),\n bem.is('disabled', item.disabled ?? false)\n ]\"\n ref=\"item\"\n @click=\"_handleClickItem\"\n >\n <UNavIcon v-if=\"item.icon\" :icon=\"item.icon\" :class=\"collapsedCls.e('icon')\" />\n\n <!-- 文本 -->\n <span :class=\"collapsedCls.e('item-title')\">\n {{ item.title }}\n </span>\n </li>\n</template>\n\n<script setup lang=\"ts\">\nimport { bem } from '@veltra/utils'\nimport { useTemplateRef } from 'vue'\n\nimport type { NavItem } from '../../types'\nimport { UTip } from '../tip'\nimport UNavIcon from './nav-icon.vue'\nimport { useNavItem } from './use-nav-item'\n\ndefineOptions({ name: 'UNavItemCollapsed' })\n\nconst props = defineProps<{ item: NavItem; depth: number }>()\n\nconst itemRef = useTemplateRef('item')\n\nconst emit = defineEmits(['click'])\n\nconst { collapsedCls, active, handleClickItem } = useNavItem({ itemProps: props, itemRef })\n\nfunction _handleClickItem() {\n handleClickItem()\n emit('click')\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;EAqDA,MAAM,QAAQ;EAEd,MAAM,UAAU,eAAe,MAAM;EAErC,MAAM,OAAO;EAEb,MAAM,EAAE,cAAc,QAAQ,oBAAoB,WAAW;GAAE,WAAW;GAAO;EAAQ,CAAC;EAE1F,SAAS,mBAAmB;GAC1B,gBAAgB;GAChB,KAAK,OAAO;EACd;;GA/DE,OAAA,UAAA,GAAA,mBAAA,UAAA,MAAA,
|
|
1
|
+
{"version":3,"file":"nav-item-collapsed.js","names":["_openBlock","_createElementBlock","_Fragment","_createCommentVNode","_createBlock","_unref","UTip","_withCtx","_createTextVNode","_toDisplayString","_createElementVNode","_normalizeClass","UNavIcon"],"sources":["../../../src/components/nav/nav-item-collapsed.vue"],"sourcesContent":["<template>\n <!-- 一级导航 -->\n <u-tip v-if=\"depth === 0\" direction=\"right\" hide-arrow>\n <li\n :class=\"[\n collapsedCls.e('item'),\n bem.is('active', active),\n bem.is('first-level'),\n bem.is('disabled', item.disabled ?? false)\n ]\"\n ref=\"item\"\n @click=\"handleClickItem\"\n >\n <UNavIcon v-if=\"item.icon\" :icon=\"item.icon\" :class=\"collapsedCls.e('icon')\" />\n <span v-else>{{ item.title[0] }}</span>\n </li>\n\n <template #content>\n {{ item.title }}\n </template>\n </u-tip>\n\n <!-- 二级以及二级以下导航 -->\n <li\n v-else\n :class=\"[\n collapsedCls.e('item'),\n bem.is('active', active),\n bem.is('disabled', item.disabled ?? false)\n ]\"\n ref=\"item\"\n @click=\"_handleClickItem\"\n >\n <UNavIcon v-if=\"item.icon\" :icon=\"item.icon\" :class=\"collapsedCls.e('icon')\" />\n\n <!-- 文本 -->\n <span :class=\"collapsedCls.e('item-title')\">\n {{ item.title }}\n </span>\n </li>\n</template>\n\n<script setup lang=\"ts\">\nimport { bem } from '@veltra/utils'\nimport { useTemplateRef } from 'vue'\n\nimport type { NavItem } from '../../types'\nimport { UTip } from '../tip'\nimport UNavIcon from './nav-icon.vue'\nimport { useNavItem } from './use-nav-item'\n\ndefineOptions({ name: 'UNavItemCollapsed' })\n\nconst props = defineProps<{ item: NavItem; depth: number }>()\n\nconst itemRef = useTemplateRef('item')\n\nconst emit = defineEmits(['click'])\n\nconst { collapsedCls, active, handleClickItem } = useNavItem({ itemProps: props, itemRef })\n\nfunction _handleClickItem() {\n handleClickItem()\n emit('click')\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;EAqDA,MAAM,QAAQ;EAEd,MAAM,UAAU,eAAe,MAAM;EAErC,MAAM,OAAO;EAEb,MAAM,EAAE,cAAc,QAAQ,oBAAoB,WAAW;GAAE,WAAW;GAAO;EAAQ,CAAC;EAE1F,SAAS,mBAAmB;GAC1B,gBAAgB;GAChB,KAAK,OAAO;EACd;;GA/DE,OAAA,UAAA,GAAA,mBAAA,UAAA,MAAA,CAAAG,mBAAA,QAAA,GACa,QAAA,UAAK,KAAlBH,UAAA,GAAAI,YAkBQC,MAAAC,WAAA,GAAA;;IAlBkB,WAAU;IAAQ,cAAA;;IAe/B,SAAOC,cACA,CAAbC,gBAAAC,gBAAA,QAAA,KAAK,KAAK,GAAA,CAAA,CAAA,CAAA;IAff,SAAAF,cAYK,CAZLG,mBAYK,MAAA;KAXF,OAAKC,eAAA;MAAYN,MAAA,YAAA,CAAY,CAAC,EAAC,MAAA;MAAkBA,MAAA,GAAA,CAAG,CAAC,GAAE,UAAWA,MAAA,MAAA,CAAM;MAAWA,MAAA,GAAA,CAAG,CAAC,GAAE,aAAA;MAAyBA,MAAA,GAAA,CAAG,CAAC,GAAE,YAAa,QAAA,KAAK,YAAQ,KAAA;;KAMnJ,KAAI;KACH,SAAK,OAAA,OAAA,OAAA,MAAE,GAAA,SAAAA,MAAA,eAAA,KAAAA,MAAA,eAAA,CAAA,CAAA,GAAA,IAAA;IAEQ,GAAA,CAAA,QAAA,KAAK,QAArBL,UAAA,GAAAI,YAA+EQ,aAAA;;KAAnD,MAAM,QAAA,KAAK;KAAO,OAAKD,eAAEN,MAAA,YAAA,CAAY,CAAC,EAAC,MAAA,CAAA;IACnE,GAAA,MAAA,GAAA,CAAA,QAAA,OAAA,CAAA,MAAAL,UAAA,GAAAC,mBAAuC,QAAA,YAAAQ,gBAAvB,QAAA,KAAK,MAAK,EAAA,GAAA,CAAA,EAAA,GAAA,CAAA,CAAA,CAAA;;GAS9B,CAAA,MAAAT,UAAA,GAAAC,mBAgBKC,UAAA,EAAA,KAAA,EAAA,GAAA,CAjBLC,mBAAA,cAAA,GACAO,mBAgBK,MAAA;IAdF,OAAKC,eAAA;KAAUN,MAAA,YAAA,CAAY,CAAC,EAAC,MAAA;KAAgBA,MAAA,GAAA,CAAG,CAAC,GAAE,UAAWA,MAAA,MAAA,CAAM;KAASA,MAAA,GAAA,CAAG,CAAC,GAAE,YAAa,QAAA,KAAK,YAAQ,KAAA;;IAK9G,KAAI;IACH,SAAO;;IAEQ,QAAA,KAAK,QAArBL,UAAA,GAAAI,YAA+EQ,aAAA;;KAAnD,MAAM,QAAA,KAAK;KAAO,OAAKD,eAAEN,MAAA,YAAA,CAAY,CAAC,EAAC,MAAA,CAAA;;IAEnEF,mBAAA,MAAA;IACAO,mBAEO,QAAA,EAFA,OAAKC,eAAEN,MAAA,YAAA,CAAY,CAAC,EAAC,YAAA,CAAA,EACvB,GAAAI,gBAAA,QAAA,KAAK,KAAK,GAAA,CAAA"}
|