@veltra/desktop 1.8.3 → 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/rich-text-editor.js.map +1 -1
- package/dist/components/rich-text-editor/toolbar.js.map +1 -1
- 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 +1 -1
- 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":"tabs-horizontal.js","names":[],"sources":["../../../src/components/tabs/tabs-horizontal.vue"],"sourcesContent":["<template>\n <div\n :class=\"[\n cls.b,\n cls.m('horizontal'),\n cls.m(position),\n cls.m(size),\n bem.is('block', block),\n bem.is('rounded', rounded)\n ]\"\n >\n <button\n v-show=\"showNav\"\n type=\"button\"\n :class=\"[cls.e('nav'), cls.em('nav', 'prev')]\"\n :disabled=\"!canPrev\"\n @click=\"scrollByStep(-1)\"\n >\n <u-icon> <ArrowLeft /> </u-icon>\n </button>\n\n <div ref=\"viewportRef\" :class=\"cls.e('viewport')\">\n <div ref=\"listRef\" :class=\"cls.e('list')\">\n <button\n type=\"button\"\n role=\"tab\"\n v-for=\"(item, index) in items\"\n :key=\"item.key\"\n :class=\"[\n cls.e('item'),\n bem.is('active', model === item.key),\n bem.is('disabled', item.disabled === true)\n ]\"\n @click.stop=\"handleClick(item, index)\"\n >\n <slot v-bind=\"{ item, index }\">\n <span :class=\"cls.e('item-label')\">{{ item.name ?? item.key }}</span>\n </slot>\n\n <span\n v-if=\"isItemClosable(item)\"\n role=\"button\"\n tabindex=\"0\"\n :class=\"cls.e('close')\"\n :aria-label=\"`close ${item.name ?? item.key}`\"\n @click.stop=\"handleClose(item, index)\"\n >\n <u-icon>\n <Close />\n </u-icon>\n </span>\n </button>\n </div>\n </div>\n\n <button\n v-show=\"showNav\"\n type=\"button\"\n :class=\"[cls.e('nav'), cls.em('nav', 'next')]\"\n :disabled=\"!canNext\"\n @click=\"scrollByStep(1)\"\n >\n <u-icon> <ArrowRight /> </u-icon>\n </button>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { ArrowLeft, ArrowRight, Close } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed, shallowRef } from 'vue'\n\nimport type { ComponentSize, TabItem, TabsHorizontalEmits, TabsHorizontalProps } from '../../types'\nimport { UIcon } from '../icon'\nimport { useTabsBar } from './use-tabs-bar'\n\ndefineOptions({ name: 'UTabsHorizontal' })\n\nconst props = withDefaults(defineProps<TabsHorizontalProps>(), {\n position: 'top',\n closable: false,\n block: false,\n rounded: false\n})\n\nconst emit = defineEmits<TabsHorizontalEmits>()\n\ndefineSlots<{ default: (props: { item: TabItem; index: number }) => any }>()\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('tabs-bar')\n\nconst model = defineModel<string>()\n\nconst viewportRef = shallowRef<HTMLElement>()\nconst listRef = shallowRef<HTMLElement>()\n\nconst itemsRef = computed(() => props.items)\n\nconst { showNav, canPrev, canNext, scrollByStep } = useTabsBar({\n viewportRef,\n listRef,\n items: itemsRef,\n model\n})\n\nconst isItemClosable = (item: TabItem) => {\n if (item.disabled) return false\n return item.closable ?? props.closable\n}\n\nconst handleClick = (item: TabItem, index: number) => {\n if (item.disabled) return\n model.value = item.key\n emit('click', item, index)\n}\n\nconst handleClose = (item: TabItem, index: number) => {\n if (item.disabled) return\n emit('close', item, index)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+EA,MAAM,QAAQ;EAOd,MAAM,OAAO;EAIb,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,MAAM,IAAI,UAAU;EAE1B,MAAM,
|
|
1
|
+
{"version":3,"file":"tabs-horizontal.js","names":["_useModel","_openBlock","_createElementBlock","_normalizeClass","_unref","_withDirectives","_createElementVNode","_createVNode","UIcon","_withCtx","_vShow","_Fragment","_renderList","_withModifiers","_renderSlot","_mergeProps","_toDisplayString","_createCommentVNode"],"sources":["../../../src/components/tabs/tabs-horizontal.vue"],"sourcesContent":["<template>\n <div\n :class=\"[\n cls.b,\n cls.m('horizontal'),\n cls.m(position),\n cls.m(size),\n bem.is('block', block),\n bem.is('rounded', rounded)\n ]\"\n >\n <button\n v-show=\"showNav\"\n type=\"button\"\n :class=\"[cls.e('nav'), cls.em('nav', 'prev')]\"\n :disabled=\"!canPrev\"\n @click=\"scrollByStep(-1)\"\n >\n <u-icon> <ArrowLeft /> </u-icon>\n </button>\n\n <div ref=\"viewportRef\" :class=\"cls.e('viewport')\">\n <div ref=\"listRef\" :class=\"cls.e('list')\">\n <button\n type=\"button\"\n role=\"tab\"\n v-for=\"(item, index) in items\"\n :key=\"item.key\"\n :class=\"[\n cls.e('item'),\n bem.is('active', model === item.key),\n bem.is('disabled', item.disabled === true)\n ]\"\n @click.stop=\"handleClick(item, index)\"\n >\n <slot v-bind=\"{ item, index }\">\n <span :class=\"cls.e('item-label')\">{{ item.name ?? item.key }}</span>\n </slot>\n\n <span\n v-if=\"isItemClosable(item)\"\n role=\"button\"\n tabindex=\"0\"\n :class=\"cls.e('close')\"\n :aria-label=\"`close ${item.name ?? item.key}`\"\n @click.stop=\"handleClose(item, index)\"\n >\n <u-icon>\n <Close />\n </u-icon>\n </span>\n </button>\n </div>\n </div>\n\n <button\n v-show=\"showNav\"\n type=\"button\"\n :class=\"[cls.e('nav'), cls.em('nav', 'next')]\"\n :disabled=\"!canNext\"\n @click=\"scrollByStep(1)\"\n >\n <u-icon> <ArrowRight /> </u-icon>\n </button>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { ArrowLeft, ArrowRight, Close } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed, shallowRef } from 'vue'\n\nimport type { ComponentSize, TabItem, TabsHorizontalEmits, TabsHorizontalProps } from '../../types'\nimport { UIcon } from '../icon'\nimport { useTabsBar } from './use-tabs-bar'\n\ndefineOptions({ name: 'UTabsHorizontal' })\n\nconst props = withDefaults(defineProps<TabsHorizontalProps>(), {\n position: 'top',\n closable: false,\n block: false,\n rounded: false\n})\n\nconst emit = defineEmits<TabsHorizontalEmits>()\n\ndefineSlots<{ default: (props: { item: TabItem; index: number }) => any }>()\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('tabs-bar')\n\nconst model = defineModel<string>()\n\nconst viewportRef = shallowRef<HTMLElement>()\nconst listRef = shallowRef<HTMLElement>()\n\nconst itemsRef = computed(() => props.items)\n\nconst { showNav, canPrev, canNext, scrollByStep } = useTabsBar({\n viewportRef,\n listRef,\n items: itemsRef,\n model\n})\n\nconst isItemClosable = (item: TabItem) => {\n if (item.disabled) return false\n return item.closable ?? props.closable\n}\n\nconst handleClick = (item: TabItem, index: number) => {\n if (item.disabled) return\n model.value = item.key\n emit('click', item, index)\n}\n\nconst handleClose = (item: TabItem, index: number) => {\n if (item.disabled) return\n emit('close', item, index)\n}\n</script>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs-vertical.js","names":[],"sources":["../../../src/components/tabs/tabs-vertical.vue"],"sourcesContent":["<template>\n <div\n :class=\"[cls.b, cls.m('vertical'), cls.m(position), cls.m(size), bem.is('rounded', rounded)]\"\n >\n <button\n type=\"button\"\n role=\"tab\"\n v-for=\"(item, index) in items\"\n :key=\"item.key\"\n :class=\"[\n cls.e('item'),\n bem.is('active', model === item.key),\n bem.is('disabled', item.disabled === true)\n ]\"\n @click.stop=\"handleClick(item, index)\"\n >\n <slot v-bind=\"{ item, index }\">\n <span :class=\"cls.e('item-label')\">{{ item.name ?? item.key }}</span>\n </slot>\n <span\n v-if=\"isItemClosable(item)\"\n role=\"button\"\n tabindex=\"0\"\n :class=\"cls.e('close')\"\n :aria-label=\"`close ${item.name ?? item.key}`\"\n @click.stop=\"handleClose(item, index)\"\n >\n <u-icon>\n <Close />\n </u-icon>\n </span>\n </button>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { Close } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\n\nimport type { ComponentSize, TabItem, TabsVerticalEmits, TabsVerticalProps } from '../../types'\nimport { UIcon } from '../icon'\n\ndefineOptions({ name: 'UTabsVertical' })\n\nconst props = withDefaults(defineProps<TabsVerticalProps>(), {\n position: 'left',\n closable: false,\n rounded: false\n})\n\nconst emit = defineEmits<TabsVerticalEmits>()\n\ndefineSlots<{ default: (props: { item: TabItem; index: number }) => any }>()\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('tabs-bar')\n\nconst model = defineModel<string>()\n\nconst isItemClosable = (item: TabItem) => {\n if (item.disabled) return false\n return item.closable ?? props.closable\n}\n\nconst handleClick = (item: TabItem, index: number) => {\n if (item.disabled) return\n model.value = item.key\n emit('click', item, index)\n}\n\nconst handleClose = (item: TabItem, index: number) => {\n if (item.disabled) return\n emit('close', item, index)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6CA,MAAM,QAAQ;EAMd,MAAM,OAAO;EAIb,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,MAAM,IAAI,UAAU;EAE1B,MAAM,
|
|
1
|
+
{"version":3,"file":"tabs-vertical.js","names":["_useModel","_openBlock","_createElementBlock","_normalizeClass","_unref","_Fragment","_renderList","_withModifiers","_renderSlot","_mergeProps","_createElementVNode","_toDisplayString","_createVNode","UIcon","_withCtx","_createCommentVNode"],"sources":["../../../src/components/tabs/tabs-vertical.vue"],"sourcesContent":["<template>\n <div\n :class=\"[cls.b, cls.m('vertical'), cls.m(position), cls.m(size), bem.is('rounded', rounded)]\"\n >\n <button\n type=\"button\"\n role=\"tab\"\n v-for=\"(item, index) in items\"\n :key=\"item.key\"\n :class=\"[\n cls.e('item'),\n bem.is('active', model === item.key),\n bem.is('disabled', item.disabled === true)\n ]\"\n @click.stop=\"handleClick(item, index)\"\n >\n <slot v-bind=\"{ item, index }\">\n <span :class=\"cls.e('item-label')\">{{ item.name ?? item.key }}</span>\n </slot>\n <span\n v-if=\"isItemClosable(item)\"\n role=\"button\"\n tabindex=\"0\"\n :class=\"cls.e('close')\"\n :aria-label=\"`close ${item.name ?? item.key}`\"\n @click.stop=\"handleClose(item, index)\"\n >\n <u-icon>\n <Close />\n </u-icon>\n </span>\n </button>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { Close } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\n\nimport type { ComponentSize, TabItem, TabsVerticalEmits, TabsVerticalProps } from '../../types'\nimport { UIcon } from '../icon'\n\ndefineOptions({ name: 'UTabsVertical' })\n\nconst props = withDefaults(defineProps<TabsVerticalProps>(), {\n position: 'left',\n closable: false,\n rounded: false\n})\n\nconst emit = defineEmits<TabsVerticalEmits>()\n\ndefineSlots<{ default: (props: { item: TabItem; index: number }) => any }>()\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('tabs-bar')\n\nconst model = defineModel<string>()\n\nconst isItemClosable = (item: TabItem) => {\n if (item.disabled) return false\n return item.closable ?? props.closable\n}\n\nconst handleClick = (item: TabItem, index: number) => {\n if (item.disabled) return\n model.value = item.key\n emit('click', item, index)\n}\n\nconst handleClose = (item: TabItem, index: number) => {\n if (item.disabled) return\n emit('close', item, index)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6CA,MAAM,QAAQ;EAMd,MAAM,OAAO;EAIb,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,MAAM,IAAI,UAAU;EAE1B,MAAM,QAAQA,SAAmB,SAAA,YAAC;EAElC,MAAM,kBAAkB,SAAkB;GACxC,IAAI,KAAK,UAAU,OAAO;GAC1B,OAAO,KAAK,YAAY,MAAM;EAChC;EAEA,MAAM,eAAe,MAAe,UAAkB;GACpD,IAAI,KAAK,UAAU;GACnB,MAAM,QAAQ,KAAK;GACnB,KAAK,SAAS,MAAM,KAAK;EAC3B;EAEA,MAAM,eAAe,MAAe,UAAkB;GACpD,IAAI,KAAK,UAAU;GACnB,KAAK,SAAS,MAAM,KAAK;EAC3B;;GA1EE,OAAAC,UAAA,GAAAC,mBA+BM,OAAA,EA9BH,OAAKC,eAAA;IAAGC,MAAA,GAAA,CAAG,CAAC;IAAGA,MAAA,GAAA,CAAG,CAAC,EAAC,UAAA;IAAcA,MAAA,GAAA,CAAG,CAAC,EAAE,QAAA,QAAQ;IAAGA,MAAA,GAAA,CAAG,CAAC,EAAEA,MAAA,IAAA,CAAI;IAAGA,MAAA,GAAA,CAAG,CAAC,GAAE,WAAY,QAAA,OAAO;GAAA,CAAA,EAAA,GAE1F,EAAAH,UAAA,IAAA,GAAAC,mBA2BSG,UAAA,MAAAC,WAxBiB,QAAA,QAAhB,MAAM,UAAK;IAHrB,OAAAL,UAAA,GAAAC,mBA2BS,UAAA;KA1BP,MAAK;KACL,MAAK;KAEJ,KAAK,KAAK;KACV,OAAKC,eAAA;MAAYC,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA;MAAkBA,MAAA,GAAA,CAAG,CAAC,GAAE,UAAW,MAAA,UAAU,KAAK,GAAG;MAAWA,MAAA,GAAA,CAAG,CAAC,GAAE,YAAa,KAAK,aAAQ,IAAA;;KAKtH,SAAKG,eAAA,WAAO,YAAY,MAAM,KAAK,GAAA,CAAA,MAAA,CAAA;IAEpC,GAAA,CAAAC,WAEO,KAAA,QAAA,WAFPC,WAEO,EAAA,SAAA,KAAA,GAAA;KAFS;KAAM;IAAK,CAAA,SAEpB,CADLC,mBAAqE,QAAA,EAA9D,OAAKP,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,YAAA,CAAA,EAAmB,GAAAO,gBAAA,KAAK,QAAQ,KAAK,GAAG,GAAA,CAAA,CAAA,CAAA,GAGrD,eAAe,IAAI,KAD3BV,UAAA,GAAAC,mBAWO,QAAA;;KATL,MAAK;KACL,UAAS;KACR,OAAKC,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,OAAA,CAAA;KACZ,cAAU,SAAW,KAAK,QAAQ,KAAK;KACvC,SAAKG,eAAA,WAAO,YAAY,MAAM,KAAK,GAAA,CAAA,MAAA,CAAA;IAEpC,GAAA,CAAAK,YAESR,MAAAS,WAAA,GAAA,MAAA;KADP,SAAAC,cAAS,CAATF,YAASR,MAAA,KAAA,CAAA,CAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabs.js","names":[],"sources":["../../../src/components/tabs/tabs.vue"],"sourcesContent":["<template>\n <div :class=\"[cls.b, cls.m(position!)]\">\n <u-tabs-horizontal\n v-if=\"isHorizontal\"\n v-model=\"model\"\n :items=\"items\"\n :position=\"horizontalPosition\"\n :size=\"size\"\n :closable=\"closable\"\n :block=\"block\"\n :rounded=\"rounded\"\n @click=\"onClick\"\n @close=\"onClose\"\n />\n <u-tabs-vertical\n v-else\n v-model=\"model\"\n :items=\"items\"\n :position=\"verticalPosition\"\n :size=\"size\"\n :closable=\"closable\"\n :rounded=\"rounded\"\n @click=\"onClick\"\n @close=\"onClose\"\n />\n\n <transition name=\"fade\" mode=\"out-in\">\n <KeepAlive v-if=\"keepAlive\">\n <component :key=\"model\" :is=\"renderSlots()\" />\n </KeepAlive>\n <component v-else :key=\"model\" :is=\"renderSlots()\" />\n </transition>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { bem } from '@veltra/utils'\nimport { computed, createVNode } from 'vue'\n\nimport type { ComponentSize, TabItem, TabsEmits, TabsProps } from '../../types'\nimport { UScroll } from '../scroll'\nimport UTabsHorizontal from './tabs-horizontal.vue'\nimport UTabsVertical from './tabs-vertical.vue'\n\ndefineOptions({ name: 'UTabs' })\n\nconst props = withDefaults(defineProps<TabsProps>(), {\n position: 'top',\n closable: false,\n block: false,\n rounded: false,\n keepAlive: false\n})\n\nconst emit = defineEmits<TabsEmits>()\n\nconst slots = defineSlots<Record<string, (props: any) => any>>()\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('tabs')\n\nconst model = defineModel<string>()\n\nconst isHorizontal = computed(() => props.position === 'top' || props.position === 'bottom')\n\n/** 避免模板中使用类型断言:收敛 position 到水平 / 垂直子组件所需的子集。 */\nconst horizontalPosition = computed<'top' | 'bottom'>(() =>\n props.position === 'bottom' ? 'bottom' : 'top'\n)\n\nconst verticalPosition = computed<'left' | 'right'>(() =>\n props.position === 'right' ? 'right' : 'left'\n)\n\nconst onClick = (item: TabItem, index: number) => emit('click', item, index)\nconst onClose = (item: TabItem, index: number) => emit('close', item, index)\n\nconst renderSlots = () => {\n const key = model.value\n if (!key) return null\n const nodes = slots[key]?.({ key })\n if (Array.isArray(nodes)) {\n return createVNode(UScroll, { class: cls.e('content') }, { default: () => nodes })\n }\n return nodes\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+CA,MAAM,QAAQ;EAQd,MAAM,OAAO;EAEb,MAAM,
|
|
1
|
+
{"version":3,"file":"tabs.js","names":["_useSlots","_useModel","UScroll","_openBlock","_createElementBlock","_normalizeClass","_unref","_createBlock","UTabsHorizontal","UTabsVertical","_createVNode","_Transition","_withCtx","_KeepAlive","_resolveDynamicComponent"],"sources":["../../../src/components/tabs/tabs.vue"],"sourcesContent":["<template>\n <div :class=\"[cls.b, cls.m(position!)]\">\n <u-tabs-horizontal\n v-if=\"isHorizontal\"\n v-model=\"model\"\n :items=\"items\"\n :position=\"horizontalPosition\"\n :size=\"size\"\n :closable=\"closable\"\n :block=\"block\"\n :rounded=\"rounded\"\n @click=\"onClick\"\n @close=\"onClose\"\n />\n <u-tabs-vertical\n v-else\n v-model=\"model\"\n :items=\"items\"\n :position=\"verticalPosition\"\n :size=\"size\"\n :closable=\"closable\"\n :rounded=\"rounded\"\n @click=\"onClick\"\n @close=\"onClose\"\n />\n\n <transition name=\"fade\" mode=\"out-in\">\n <KeepAlive v-if=\"keepAlive\">\n <component :key=\"model\" :is=\"renderSlots()\" />\n </KeepAlive>\n <component v-else :key=\"model\" :is=\"renderSlots()\" />\n </transition>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { bem } from '@veltra/utils'\nimport { computed, createVNode } from 'vue'\n\nimport type { ComponentSize, TabItem, TabsEmits, TabsProps } from '../../types'\nimport { UScroll } from '../scroll'\nimport UTabsHorizontal from './tabs-horizontal.vue'\nimport UTabsVertical from './tabs-vertical.vue'\n\ndefineOptions({ name: 'UTabs' })\n\nconst props = withDefaults(defineProps<TabsProps>(), {\n position: 'top',\n closable: false,\n block: false,\n rounded: false,\n keepAlive: false\n})\n\nconst emit = defineEmits<TabsEmits>()\n\nconst slots = defineSlots<Record<string, (props: any) => any>>()\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst cls = bem('tabs')\n\nconst model = defineModel<string>()\n\nconst isHorizontal = computed(() => props.position === 'top' || props.position === 'bottom')\n\n/** 避免模板中使用类型断言:收敛 position 到水平 / 垂直子组件所需的子集。 */\nconst horizontalPosition = computed<'top' | 'bottom'>(() =>\n props.position === 'bottom' ? 'bottom' : 'top'\n)\n\nconst verticalPosition = computed<'left' | 'right'>(() =>\n props.position === 'right' ? 'right' : 'left'\n)\n\nconst onClick = (item: TabItem, index: number) => emit('click', item, index)\nconst onClose = (item: TabItem, index: number) => emit('close', item, index)\n\nconst renderSlots = () => {\n const key = model.value\n if (!key) return null\n const nodes = slots[key]?.({ key })\n if (Array.isArray(nodes)) {\n return createVNode(UScroll, { class: cls.e('content') }, { default: () => nodes })\n }\n return nodes\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+CA,MAAM,QAAQ;EAQd,MAAM,OAAO;EAEb,MAAM,QAAQA,SAAA;EAEd,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,MAAM,IAAI,MAAM;EAEtB,MAAM,QAAQC,SAAmB,SAAA,YAAC;EAElC,MAAM,eAAe,eAAe,MAAM,aAAa,SAAS,MAAM,aAAa,QAAQ;;EAG3F,MAAM,qBAAqB,eACzB,MAAM,aAAa,WAAW,WAAW,KAC3C;EAEA,MAAM,mBAAmB,eACvB,MAAM,aAAa,UAAU,UAAU,MACzC;EAEA,MAAM,WAAW,MAAe,UAAkB,KAAK,SAAS,MAAM,KAAK;EAC3E,MAAM,WAAW,MAAe,UAAkB,KAAK,SAAS,MAAM,KAAK;EAE3E,MAAM,oBAAoB;GACxB,MAAM,MAAM,MAAM;GAClB,IAAI,CAAC,KAAK,OAAO;GACjB,MAAM,QAAQ,MAAM,IAAI,GAAG,EAAE,IAAI,CAAC;GAClC,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO,YAAYC,aAAS,EAAE,OAAO,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,MAAM,CAAC;GAEnF,OAAO;EACT;;GAtFE,OAAAC,UAAA,GAAAC,mBA+BM,OAAA,EA/BA,OAAKC,eAAA,CAAGC,MAAA,GAAA,CAAG,CAAC,GAAGA,MAAA,GAAA,CAAG,CAAC,EAAE,QAAA,QAAQ,CAAA,CAAA,EAAA,GAEzB,CAAA,aAAA,SADRH,UAAA,GAAAI,YAWEC,aAAA;;IATS,YAAA,MAAA;IAAA,uBAAA,OAAA,OAAA,OAAA,MAAA,WAAA,MAAK,QAAA;IACb,OAAO,QAAA;IACP,UAAU,mBAAA;IACV,MAAMF,MAAA,IAAA;IACN,UAAU,QAAA;IACV,OAAO,QAAA;IACP,SAAS,QAAA;IACF;IACA;;;;;;;;;GAEV,CAAA,MAAAH,UAAA,GAAAI,YAUEE,aAAA;;IARS,YAAA,MAAA;IAAA,uBAAA,OAAA,OAAA,OAAA,MAAA,WAAA,MAAK,QAAA;IACb,OAAO,QAAA;IACP,UAAU,iBAAA;IACV,MAAMH,MAAA,IAAA;IACN,UAAU,QAAA;IACV,SAAS,QAAA;IACF;IACA;;;;;;;;GAGV,CAAA,IAAAI,YAKaC,YAAA;IALD,MAAK;IAAO,MAAK;;IAC3B,SAAAC,cAEY,CAFK,QAAA,aAAjBT,UAAA,GAAAI,YAEYM,WAAA,EAAA,KAAA,EAAA,GAAA,EADVV,UAAA,GAAAI,YAA8CO,wBAAjB,YAAW,CAAA,GAAA,EAA5B,KAAK,MAAA,MAAK,CAAA,EAAA,GAAA,IAExB,MAAAX,UAAA,GAAAI,YAAqDO,wBAAjB,YAAW,CAAA,GAAA,EAA5B,KAAK,MAAA,MAAK,CAAA,EAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tag.js","names":[],"sources":["../../../src/components/tag/tag.vue"],"sourcesContent":["<template>\n <span :class=\"className\">\n <span :class=\"cls.e('content')\">\n <slot />\n </span>\n\n <u-icon v-if=\"closable\" @click.stop=\"handleClose\" :class=\"cls.e('icon-close')\">\n <Close />\n </u-icon>\n </span>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { Close } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { TagEmits, TagProps } from '../../types'\nimport { UIcon } from '../icon'\n\ndefineOptions({ name: 'UTag' })\n\nconst cls = bem('tag')\n\nconst props = defineProps<TagProps>()\n\nconst emit = defineEmits<TagEmits>()\n\nconst { formProps } = injectFormContext()\nconst { size } = useFormFallbackProps([formProps ?? {}, props], { size: 'default' })\n\nconst handleClose = () => {\n emit('close')\n}\n\nconst className = computed(() => {\n const { type } = props\n return [\n cls.b,\n cls.m(size.value),\n type && cls.m('color-' + type),\n bem.is('round', props.round),\n bem.is('dark', props.dark)\n ]\n})\n\n// const classRound = computed(() => {\n// return [bem.is('round', props.round)]\n// })\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;EAwBA,MAAM,MAAM,IAAI,KAAK;EAErB,MAAM,QAAQ;EAEd,MAAM,OAAO;EAEb,MAAM,EAAE,cAAc,kBAAkB;EACxC,MAAM,EAAE,SAAS,qBAAqB,CAAC,aAAa,CAAC,GAAG,KAAK,GAAG,EAAE,MAAM,UAAU,CAAC;EAEnF,MAAM,oBAAoB;GACxB,KAAK,OAAO;EACd;EAEA,MAAM,YAAY,eAAe;GAC/B,MAAM,EAAE,SAAS;GACjB,OAAO;IACL,IAAI;IACJ,IAAI,EAAE,KAAK,KAAK;IAChB,QAAQ,IAAI,EAAE,WAAW,IAAI;IAC7B,IAAI,GAAG,SAAS,MAAM,KAAK;IAC3B,IAAI,GAAG,QAAQ,MAAM,IAAI;GAC3B;EACF,CAAC;;GA7CC,
|
|
1
|
+
{"version":3,"file":"tag.js","names":["_openBlock","_createElementBlock","_normalizeClass","_createElementVNode","_unref","_renderSlot","_createBlock","UIcon","_withModifiers","_withCtx","_createVNode","_createCommentVNode"],"sources":["../../../src/components/tag/tag.vue"],"sourcesContent":["<template>\n <span :class=\"className\">\n <span :class=\"cls.e('content')\">\n <slot />\n </span>\n\n <u-icon v-if=\"closable\" @click.stop=\"handleClose\" :class=\"cls.e('icon-close')\">\n <Close />\n </u-icon>\n </span>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { Close } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { TagEmits, TagProps } from '../../types'\nimport { UIcon } from '../icon'\n\ndefineOptions({ name: 'UTag' })\n\nconst cls = bem('tag')\n\nconst props = defineProps<TagProps>()\n\nconst emit = defineEmits<TagEmits>()\n\nconst { formProps } = injectFormContext()\nconst { size } = useFormFallbackProps([formProps ?? {}, props], { size: 'default' })\n\nconst handleClose = () => {\n emit('close')\n}\n\nconst className = computed(() => {\n const { type } = props\n return [\n cls.b,\n cls.m(size.value),\n type && cls.m('color-' + type),\n bem.is('round', props.round),\n bem.is('dark', props.dark)\n ]\n})\n\n// const classRound = computed(() => {\n// return [bem.is('round', props.round)]\n// })\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;EAwBA,MAAM,MAAM,IAAI,KAAK;EAErB,MAAM,QAAQ;EAEd,MAAM,OAAO;EAEb,MAAM,EAAE,cAAc,kBAAkB;EACxC,MAAM,EAAE,SAAS,qBAAqB,CAAC,aAAa,CAAC,GAAG,KAAK,GAAG,EAAE,MAAM,UAAU,CAAC;EAEnF,MAAM,oBAAoB;GACxB,KAAK,OAAO;EACd;EAEA,MAAM,YAAY,eAAe;GAC/B,MAAM,EAAE,SAAS;GACjB,OAAO;IACL,IAAI;IACJ,IAAI,EAAE,KAAK,KAAK;IAChB,QAAQ,IAAI,EAAE,WAAW,IAAI;IAC7B,IAAI,GAAG,SAAS,MAAM,KAAK;IAC3B,IAAI,GAAG,QAAQ,MAAM,IAAI;GAC3B;EACF,CAAC;;GA7CC,OAAAA,UAAA,GAAAC,mBAQO,QAAA,EARA,OAAKC,eAAE,UAAA,KAAS,EAAA,GACrB,CAAAC,mBAEO,QAAA,EAFA,OAAKD,eAAEE,MAAA,GAAA,CAAG,CAAC,EAAC,SAAA,CAAA,EAAA,GACjB,CAAAC,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,CAGI,GAAA,QAAA,YAAdL,UAAA,GAAAM,YAESF,MAAAG,WAAA,GAAA;;IAFgB,SAAKC,cAAO,aAAW,CAAA,MAAA,CAAA;IAAG,OAAKN,eAAEE,MAAA,GAAA,CAAG,CAAC,EAAC,YAAA,CAAA;;IAC7D,SAAAK,cAAS,CAATC,YAASN,MAAA,KAAA,CAAA,CAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.js","names":[],"sources":["../../../src/components/text/text.vue"],"sourcesContent":["<template>\n <p :class=\"classList\" :style=\"style\">\n <UNodeRender :content=\"getTextVNode()\" ref=\"aa\" />\n </p>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem, withUnit, isTextNode, getHighlightChunks } from '@veltra/utils'\nimport { type CSSProperties, type VNode, computed, useSlots, h, createTextVNode } from 'vue'\n\nimport type { TextProps } from '../../types'\nimport { UNodeRender } from '../node-render'\n\ndefineOptions({ name: 'UText' })\n\nconst props = withDefaults(defineProps<TextProps>(), { as: 'content' })\n\nconst cls = bem('text')\n\nconst classList = computed(() => {\n return [cls.b, bem.is(props.as), bem.is('bold', props.bold), bem.is('italic', props.italic)]\n})\n\nconst style = computed(() => {\n const style: CSSProperties = { fontSize: withUnit(props.fontSize, 'px') }\n const { deleted, underline } = props\n if (deleted) {\n style.textDecoration = 'line-through'\n }\n if (underline) {\n style.textDecoration = 'underline'\n }\n\n return style\n})\n\nconst slots = useSlots()\nconst getTextVNode = () => {\n const nodes = slots.default?.()\n if (!nodes?.length) return undefined\n\n // 只允许渲染文本\n const textNodes = nodes.filter((node) => isTextNode(node))\n\n const { highlight } = props\n\n if (!highlight) {\n return textNodes\n }\n\n return textNodes.reduce((nodes, textNode) => {\n const chunks = getHighlightChunks(\n textNode.children as string,\n Array.isArray(highlight) ? highlight : [highlight]\n )\n\n chunks.forEach((chunk) => {\n if (chunk.highlight) {\n nodes.push(h('mark', chunk.text))\n } else {\n nodes.push(createTextVNode(chunk.text))\n }\n })\n\n return nodes\n }, [] as VNode[])\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;EAeA,MAAM,QAAQ;EAEd,MAAM,MAAM,IAAI,MAAM;EAEtB,MAAM,YAAY,eAAe;GAC/B,OAAO;IAAC,IAAI;IAAG,IAAI,GAAG,MAAM,EAAE;IAAG,IAAI,GAAG,QAAQ,MAAM,IAAI;IAAG,IAAI,GAAG,UAAU,MAAM,MAAM;GAAC;EAC7F,CAAC;EAED,MAAM,QAAQ,eAAe;GAC3B,MAAM,QAAuB,EAAE,UAAU,SAAS,MAAM,UAAU,IAAI,EAAE;GACxE,MAAM,EAAE,SAAS,cAAc;GAC/B,IAAI,SACF,MAAM,iBAAiB;GAEzB,IAAI,WACF,MAAM,iBAAiB;GAGzB,OAAO;EACT,CAAC;EAED,MAAM,QAAQ,SAAS;EACvB,MAAM,qBAAqB;GACzB,MAAM,QAAQ,MAAM,UAAU;GAC9B,IAAI,CAAC,OAAO,QAAQ,OAAO,KAAA;GAG3B,MAAM,YAAY,MAAM,QAAQ,SAAS,WAAW,IAAI,CAAC;GAEzD,MAAM,EAAE,cAAc;GAEtB,IAAI,CAAC,WACH,OAAO;GAGT,OAAO,UAAU,QAAQ,OAAO,aAAa;IAM3C,mBAJE,SAAS,UACT,MAAM,QAAQ,SAAS,IAAI,YAAY,CAAC,SAAS,CAGnD,CAAA,CAAO,SAAS,UAAU;KACxB,IAAI,MAAM,WACR,MAAM,KAAK,EAAE,QAAQ,MAAM,IAAI,CAAC;UAEhC,MAAM,KAAK,gBAAgB,MAAM,IAAI,CAAC;IAE1C,CAAC;IAED,OAAO;GACT,GAAG,CAAC,CAAY;EAClB;;GAjEE,
|
|
1
|
+
{"version":3,"file":"text.js","names":["_openBlock","_createElementBlock","_normalizeClass","_normalizeStyle","_createVNode","_unref","UNodeRender"],"sources":["../../../src/components/text/text.vue"],"sourcesContent":["<template>\n <p :class=\"classList\" :style=\"style\">\n <UNodeRender :content=\"getTextVNode()\" ref=\"aa\" />\n </p>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem, withUnit, isTextNode, getHighlightChunks } from '@veltra/utils'\nimport { type CSSProperties, type VNode, computed, useSlots, h, createTextVNode } from 'vue'\n\nimport type { TextProps } from '../../types'\nimport { UNodeRender } from '../node-render'\n\ndefineOptions({ name: 'UText' })\n\nconst props = withDefaults(defineProps<TextProps>(), { as: 'content' })\n\nconst cls = bem('text')\n\nconst classList = computed(() => {\n return [cls.b, bem.is(props.as), bem.is('bold', props.bold), bem.is('italic', props.italic)]\n})\n\nconst style = computed(() => {\n const style: CSSProperties = { fontSize: withUnit(props.fontSize, 'px') }\n const { deleted, underline } = props\n if (deleted) {\n style.textDecoration = 'line-through'\n }\n if (underline) {\n style.textDecoration = 'underline'\n }\n\n return style\n})\n\nconst slots = useSlots()\nconst getTextVNode = () => {\n const nodes = slots.default?.()\n if (!nodes?.length) return undefined\n\n // 只允许渲染文本\n const textNodes = nodes.filter((node) => isTextNode(node))\n\n const { highlight } = props\n\n if (!highlight) {\n return textNodes\n }\n\n return textNodes.reduce((nodes, textNode) => {\n const chunks = getHighlightChunks(\n textNode.children as string,\n Array.isArray(highlight) ? highlight : [highlight]\n )\n\n chunks.forEach((chunk) => {\n if (chunk.highlight) {\n nodes.push(h('mark', chunk.text))\n } else {\n nodes.push(createTextVNode(chunk.text))\n }\n })\n\n return nodes\n }, [] as VNode[])\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;EAeA,MAAM,QAAQ;EAEd,MAAM,MAAM,IAAI,MAAM;EAEtB,MAAM,YAAY,eAAe;GAC/B,OAAO;IAAC,IAAI;IAAG,IAAI,GAAG,MAAM,EAAE;IAAG,IAAI,GAAG,QAAQ,MAAM,IAAI;IAAG,IAAI,GAAG,UAAU,MAAM,MAAM;GAAC;EAC7F,CAAC;EAED,MAAM,QAAQ,eAAe;GAC3B,MAAM,QAAuB,EAAE,UAAU,SAAS,MAAM,UAAU,IAAI,EAAE;GACxE,MAAM,EAAE,SAAS,cAAc;GAC/B,IAAI,SACF,MAAM,iBAAiB;GAEzB,IAAI,WACF,MAAM,iBAAiB;GAGzB,OAAO;EACT,CAAC;EAED,MAAM,QAAQ,SAAS;EACvB,MAAM,qBAAqB;GACzB,MAAM,QAAQ,MAAM,UAAU;GAC9B,IAAI,CAAC,OAAO,QAAQ,OAAO,KAAA;GAG3B,MAAM,YAAY,MAAM,QAAQ,SAAS,WAAW,IAAI,CAAC;GAEzD,MAAM,EAAE,cAAc;GAEtB,IAAI,CAAC,WACH,OAAO;GAGT,OAAO,UAAU,QAAQ,OAAO,aAAa;IAM3C,mBAJE,SAAS,UACT,MAAM,QAAQ,SAAS,IAAI,YAAY,CAAC,SAAS,CAGnD,CAAA,CAAO,SAAS,UAAU;KACxB,IAAI,MAAM,WACR,MAAM,KAAK,EAAE,QAAQ,MAAM,IAAI,CAAC;UAEhC,MAAM,KAAK,gBAAgB,MAAM,IAAI,CAAC;IAE1C,CAAC;IAED,OAAO;GACT,GAAG,CAAC,CAAY;EAClB;;GAjEE,OAAAA,UAAA,GAAAC,mBAEI,KAAA;IAFA,OAAKC,eAAE,UAAA,KAAS;IAAG,OAAKC,eAAE,MAAA,KAAK;GACjC,GAAA,CAAAC,YAAkDC,MAAAC,UAAA,GAAA;IAApC,SAAS,aAAY;IAAI,KAAI"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textarea.js","names":[],"sources":["../../../src/components/textarea/textarea.vue"],"sourcesContent":["<template>\n <div\n v-if=\"!readonly\"\n :class=\"textareaClass\"\n @mouseenter=\"hovered = true\"\n @mouseleave=\"hovered = false\"\n >\n <textarea\n :class=\"cls.e('native')\"\n :placeholder=\"placeholder\"\n v-model=\"model\"\n :maxlength=\"maxlength\"\n :rows=\"rows\"\n :cols=\"cols\"\n @input=\"handleInput\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n @change=\"handleChange\"\n :disabled=\"disabled\"\n :readonly=\"nativeReadonly\"\n ref=\"textareaRef\"\n />\n <span v-if=\"props.maxlength && props.showCount\" :class=\"cls.m('count')\">\n {{ initNum }}/{{ props.maxlength }}\n </span>\n <Transition name=\"zoom-in\" mode=\"out-in\">\n <u-icon\n v-if=\"props.clearable && model! && hovered && !disabled && !readonly\"\n :class=\"cls.m('clear')\"\n @click.stop=\"handleClear\"\n >\n <Close />\n </u-icon>\n </Transition>\n </div>\n\n <span v-else style=\"white-space: pre-wrap\">\n {{ model || FORM_EMPTY_CONTENT }}\n </span>\n</template>\n\n<script lang=\"ts\" 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, ref, shallowRef, watch } from 'vue'\n\nimport type { TextareaProps, TextareaEmits, ComponentSize } from '../../types'\nimport { UIcon } from '../icon'\nimport { calcTextareaHeight } from './utils'\n\ndefineOptions({ name: 'UTextarea' })\n\nconst props = withDefaults(defineProps<TextareaProps>(), {\n placeholder: '请输入',\n resize: true,\n clearable: true,\n disabled: undefined,\n readonly: undefined,\n autosize: false\n})\n\nconst cls = bem('textarea')\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default' as ComponentSize,\n disabled: false,\n readonly: false\n})\n\nconst emit = defineEmits<TextareaEmits>()\n\nconst textareaRef = ref<HTMLTextAreaElement | null>(null)\n\nconst model = defineModel<string>()\n\nconst hovered = shallowRef(false)\n\nconst { focus, handleBlur, handleFocus } = useFocus((focused) => {\n focused ? emit('focus') : emit('blur')\n})\n\nconst textareaClass = computed(() => {\n return [\n cls.b,\n cls.m(size.value),\n bem.is('resize-none', !props.resize),\n bem.is('disabled', disabled.value),\n bem.is('readonly', readonly.value),\n bem.is('focus', focus.value),\n cls.m('more')\n ]\n})\n\nconst handleInput = (e: Event) => {\n const value = (e.target as HTMLTextAreaElement).value\n if (value.length > props.maxlength!) {\n // 如果输入的字符数超过了最大长度,截取字符串到最大长度\n const truncatedValue = value.slice(0, props.maxlength)\n emit('update:modelValue', truncatedValue)\n } else {\n // 如果没有超过最大长度,则正常更新模型值\n emit('update:modelValue', value)\n }\n}\n\nconst initNum = computed(() => {\n if (!props.maxlength) return 0\n return props.maxlength - (model.value?.length ?? 0)\n})\n\nconst handleClear = () => {\n model.value = ''\n emit('clear')\n}\n\nconst handleChange = (e: Event) => {\n emit('change', (e.target as HTMLTextAreaElement).value)\n}\n\nwatch(\n [model, textareaRef],\n ([model, textareaRef]) => {\n if (!textareaRef) return\n if (!props.autosize) return\n calcTextareaHeight(textareaRef)\n },\n { immediate: true }\n)\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsDA,MAAM,QAAQ;EASd,MAAM,MAAM,IAAI,UAAU;EAE1B,MAAM,EAAE,cAAc,kBAAkB;EAExC,MAAM,EAAE,MAAM,UAAU,aAAa,qBAAqB,CAAC,aAAa,CAAC,GAAG,KAAK,GAAG;GAClF,MAAM;GACN,UAAU;GACV,UAAU;EACZ,CAAC;EAED,MAAM,OAAO;EAEb,MAAM,cAAc,IAAgC,IAAI;EAExD,MAAM,
|
|
1
|
+
{"version":3,"file":"textarea.js","names":["_useModel","_unref","_openBlock","_createElementBlock","_normalizeClass","_withDirectives","_createElementVNode","_vModelText","_toDisplayString","_createCommentVNode","_createVNode","_Transition","_withCtx","_createBlock","UIcon","_withModifiers"],"sources":["../../../src/components/textarea/textarea.vue"],"sourcesContent":["<template>\n <div\n v-if=\"!readonly\"\n :class=\"textareaClass\"\n @mouseenter=\"hovered = true\"\n @mouseleave=\"hovered = false\"\n >\n <textarea\n :class=\"cls.e('native')\"\n :placeholder=\"placeholder\"\n v-model=\"model\"\n :maxlength=\"maxlength\"\n :rows=\"rows\"\n :cols=\"cols\"\n @input=\"handleInput\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n @change=\"handleChange\"\n :disabled=\"disabled\"\n :readonly=\"nativeReadonly\"\n ref=\"textareaRef\"\n />\n <span v-if=\"props.maxlength && props.showCount\" :class=\"cls.m('count')\">\n {{ initNum }}/{{ props.maxlength }}\n </span>\n <Transition name=\"zoom-in\" mode=\"out-in\">\n <u-icon\n v-if=\"props.clearable && model! && hovered && !disabled && !readonly\"\n :class=\"cls.m('clear')\"\n @click.stop=\"handleClear\"\n >\n <Close />\n </u-icon>\n </Transition>\n </div>\n\n <span v-else style=\"white-space: pre-wrap\">\n {{ model || FORM_EMPTY_CONTENT }}\n </span>\n</template>\n\n<script lang=\"ts\" 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, ref, shallowRef, watch } from 'vue'\n\nimport type { TextareaProps, TextareaEmits, ComponentSize } from '../../types'\nimport { UIcon } from '../icon'\nimport { calcTextareaHeight } from './utils'\n\ndefineOptions({ name: 'UTextarea' })\n\nconst props = withDefaults(defineProps<TextareaProps>(), {\n placeholder: '请输入',\n resize: true,\n clearable: true,\n disabled: undefined,\n readonly: undefined,\n autosize: false\n})\n\nconst cls = bem('textarea')\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default' as ComponentSize,\n disabled: false,\n readonly: false\n})\n\nconst emit = defineEmits<TextareaEmits>()\n\nconst textareaRef = ref<HTMLTextAreaElement | null>(null)\n\nconst model = defineModel<string>()\n\nconst hovered = shallowRef(false)\n\nconst { focus, handleBlur, handleFocus } = useFocus((focused) => {\n focused ? emit('focus') : emit('blur')\n})\n\nconst textareaClass = computed(() => {\n return [\n cls.b,\n cls.m(size.value),\n bem.is('resize-none', !props.resize),\n bem.is('disabled', disabled.value),\n bem.is('readonly', readonly.value),\n bem.is('focus', focus.value),\n cls.m('more')\n ]\n})\n\nconst handleInput = (e: Event) => {\n const value = (e.target as HTMLTextAreaElement).value\n if (value.length > props.maxlength!) {\n // 如果输入的字符数超过了最大长度,截取字符串到最大长度\n const truncatedValue = value.slice(0, props.maxlength)\n emit('update:modelValue', truncatedValue)\n } else {\n // 如果没有超过最大长度,则正常更新模型值\n emit('update:modelValue', value)\n }\n}\n\nconst initNum = computed(() => {\n if (!props.maxlength) return 0\n return props.maxlength - (model.value?.length ?? 0)\n})\n\nconst handleClear = () => {\n model.value = ''\n emit('clear')\n}\n\nconst handleChange = (e: Event) => {\n emit('change', (e.target as HTMLTextAreaElement).value)\n}\n\nwatch(\n [model, textareaRef],\n ([model, textareaRef]) => {\n if (!textareaRef) return\n if (!props.autosize) return\n calcTextareaHeight(textareaRef)\n },\n { immediate: true }\n)\n</script>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.js","names":[],"sources":["../../../src/components/theme/theme.vue"],"sourcesContent":["<template>\n <div :class=\"cls.b\">\n <div :class=\"cls.e('header')\">\n <div :class=\"cls.e('header-copy')\">\n <strong>主题变量配置</strong>\n </div>\n <div :class=\"cls.e('tags')\">\n <span :class=\"cls.e('tag')\">基线 {{ baselineLabel }}</span>\n <span :class=\"cls.e('tag')\">{{ changedFieldKeys.size }} 改动</span>\n </div>\n </div>\n\n <div :class=\"cls.e('toolbar')\">\n <u-input\n v-model=\"keyword\"\n :class=\"cls.e('search')\"\n placeholder=\"搜索变量名、中文标签或分组\"\n />\n\n <button\n type=\"button\"\n :class=\"[cls.e('toggle'), bem.is('active', changedOnly)]\"\n @click=\"changedOnly = !changedOnly\"\n >\n {{ changedOnly ? '查看全部' : '仅看改动' }}\n </button>\n </div>\n\n <div :class=\"cls.e('body')\">\n <div :class=\"cls.e('nav')\">\n <button\n v-for=\"section in sectionStates\"\n :key=\"section.key\"\n type=\"button\"\n :class=\"[\n cls.e('nav-item'),\n bem.is('active', activeSection === section.key),\n bem.is('disabled', !section.visibleFields.length)\n ]\"\n @click=\"activeSection = section.key\"\n >\n <span :class=\"cls.e('nav-main')\">{{ section.title }}</span>\n <span :class=\"cls.e('nav-meta')\">\n {{ section.visibleFields.length }}/{{ section.fields.length }}\n <template v-if=\"section.changedCount\"> · {{ section.changedCount }} 改动 </template>\n </span>\n </button>\n </div>\n\n <div :class=\"cls.e('panel')\">\n <div v-if=\"activeState\" :class=\"cls.e('panel-head')\">\n <div>\n <h4 :class=\"cls.e('panel-title')\">{{ activeState.title }}</h4>\n <p :class=\"cls.e('panel-desc')\">{{ activeState.description }}</p>\n </div>\n\n <div :class=\"cls.e('panel-count')\">{{ activeState.visibleFields.length }} 项</div>\n </div>\n\n <div v-if=\"activeState?.visibleFields.length\" :class=\"cls.e('list')\">\n <div\n v-for=\"field in activeState.visibleFields\"\n :key=\"field.key\"\n :class=\"[cls.e('item'), bem.is('changed', isFieldChanged(field))]\"\n >\n <div :class=\"cls.e('item-head')\">\n <div :class=\"cls.e('item-copy')\">\n <label :class=\"cls.e('item-label')\">{{ field.label }}</label>\n <div :class=\"cls.e('item-meta')\">\n <span :class=\"cls.e('item-code-label')\">Theme</span>\n <code :class=\"cls.e('item-code')\">{{ getThemePath(field.path) }}</code>\n </div>\n <div :class=\"cls.e('item-meta')\">\n <span :class=\"cls.e('item-code-label')\">CSS</span>\n <code :class=\"cls.e('item-code')\">{{ getCssVarName(field.path) }}</code>\n </div>\n </div>\n\n <span v-if=\"isFieldChanged(field)\" :class=\"cls.e('item-badge')\"> 已修改 </span>\n </div>\n\n <div v-if=\"field.kind === 'palette'\" :class=\"cls.e('palette-field')\">\n <template v-if=\"field.path[0] === 'color'\">\n <div :class=\"cls.e('palette-custom')\">\n <u-palette\n :model-value=\"String(getFieldValue(field) ?? '')\"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n <u-input\n :model-value=\"String(getFieldValue(field) ?? '')\"\n placeholder=\"例如:#1E88E5\"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n </div>\n </template>\n <template v-else>\n <div :class=\"cls.e('palette-custom')\">\n <u-palette\n :model-value=\"\n String(getFieldValue(field) ?? '').startsWith('var')\n ? ''\n : String(getFieldValue(field) ?? '')\n \"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n <u-input\n :model-value=\"String(getFieldValue(field) ?? '')\"\n placeholder=\"输入颜色或变量\"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n </div>\n <div :class=\"cls.e('palette-var')\">\n <span :class=\"cls.e('palette-var-label')\">或选择变量</span>\n <u-select\n :model-value=\"\n String(getFieldValue(field) ?? '').startsWith('var')\n ? String(getFieldValue(field) ?? '')\n : ''\n \"\n :options=\"colorVarOptions\"\n clearable\n placeholder=\"选择预设变量\"\n @update:model-value=\"(value) => updateField(field, value ?? '')\"\n >\n <template #default=\"{ option }\">\n <div style=\"display: flex; align-items: center; gap: 8px\">\n <div\n :style=\"`width: 14px; height: 14px; border-radius: 4px; background: ${option.value}`\"\n />\n <span style=\"font-size: 13px\">{{ option.label }}</span>\n </div>\n </template>\n </u-select>\n </div>\n </template>\n </div>\n\n <component\n v-else\n :is=\"getFieldComponent(field)\"\n :model-value=\"getFieldValue(field)\"\n v-bind=\"getFieldProps(field)\"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n\n <p v-if=\"field.hint || field.placeholder\" :class=\"cls.e('item-hint')\">\n {{ field.hint ?? field.placeholder }}\n </p>\n </div>\n </div>\n\n <div v-else :class=\"cls.e('empty')\">\n <strong>没有匹配项</strong>\n <p>换一个关键字,或关闭“仅看改动”后再继续筛选。</p>\n </div>\n </div>\n </div>\n\n <div :class=\"cls.e('actions')\">\n <div :class=\"cls.e('preset-group')\">\n <button type=\"button\" :class=\"cls.e('preset')\" @click=\"applyPreset('light')\">\n 浅色预设\n </button>\n <button type=\"button\" :class=\"cls.e('preset')\" @click=\"applyPreset('dark')\">\n 深色预设\n </button>\n </div>\n\n <u-button :class=\"cls.e('action-btn')\" @click=\"handleResetTheme\"> 重置 </u-button>\n <u-button :class=\"cls.e('action-btn')\" type=\"primary\" @click=\"handleExportTheme\">\n 导出\n </u-button>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport {\n type Theme,\n UITheme,\n currentTheme,\n darkTheme,\n lightTheme,\n loadTheme\n} from '@veltra/styles/theme'\nimport { bem } from '@veltra/utils'\nimport { computed, shallowRef, watch, watchEffect } from 'vue'\n\nimport type { ThemeProps, _ThemeExposed } from '../../types'\nimport { UButton } from '../button'\nimport { UInput } from '../input'\nimport { UNumberInput } from '../number-input'\nimport { UPalette } from '../palette'\nimport { USelect } from '../select'\nimport { THEME_SECTIONS } from './schema'\nimport type { ThemeField } from './schema'\n\ndefineOptions({ name: 'UTheme' })\n\nconst props = defineProps<ThemeProps>()\n\nconst cls = bem('theme')\n\nconst keyword = shallowRef('')\nconst changedOnly = shallowRef(false)\nconst activeSection = shallowRef(THEME_SECTIONS[0]!.key)\n\nconst colorVarOptions = computed(() => {\n const options: { label: string; value: string }[] = []\n THEME_SECTIONS.forEach((section) => {\n section.fields.forEach((field) => {\n if (field.kind === 'palette') {\n const varName = `var(${getCssVarName(field.path)})`\n options.push({ label: `${field.label}`, value: varName })\n }\n })\n })\n return options\n})\n\nconst editorTheme = shallowRef<UITheme>()\nconst baselineTheme = shallowRef<Theme>(createThemeSnapshot(lightTheme.theme))\nconst baselineLabel = shallowRef('浅色预设')\n\nconst lightPreset = createThemeSnapshot(lightTheme.theme)\nconst darkPreset = createThemeSnapshot(darkTheme.theme)\n\nconst sourceTheme = computed(() => {\n return props.theme ?? currentTheme.value ?? lightTheme\n})\n\nwatch(\n sourceTheme,\n (theme) => {\n if (!props.theme && theme === editorTheme.value) return\n\n const nextTheme = props.theme\n ? theme\n : new UITheme(createThemeSnapshot(theme.theme), { series: theme.series })\n\n editorTheme.value = nextTheme\n baselineTheme.value = createThemeSnapshot(nextTheme.theme)\n baselineLabel.value =\n theme === darkTheme\n ? '深色预设'\n : theme === lightTheme\n ? '浅色预设'\n : props.theme\n ? '外部主题'\n : '当前主题'\n\n if (!props.theme && currentTheme.value !== nextTheme) {\n loadTheme(nextTheme)\n }\n },\n { immediate: true }\n)\n\nconst changedFieldKeys = computed(() => {\n const keys = new Set<string>()\n\n THEME_SECTIONS.forEach((section) => {\n section.fields.forEach((field) => {\n if (\n getByPath(editorTheme.value?.theme ?? lightTheme.theme, field.path) !==\n getByPath(baselineTheme.value, field.path)\n ) {\n keys.add(field.key)\n }\n })\n })\n\n return keys\n})\n\nconst sectionStates = computed(() => {\n const normalizedKeyword = keyword.value.trim().toLowerCase()\n\n return THEME_SECTIONS.map((section) => {\n const sectionMatched = `${section.title} ${section.description}`\n .toLowerCase()\n .includes(normalizedKeyword)\n\n const visibleFields = section.fields.filter((field) => {\n const matchesKeyword =\n !normalizedKeyword ||\n sectionMatched ||\n `${field.label} ${field.key} ${getThemePath(field.path)} ${getCssVarName(field.path)}`\n .toLowerCase()\n .includes(normalizedKeyword)\n\n if (!matchesKeyword) return false\n\n if (changedOnly.value && !changedFieldKeys.value.has(field.key)) {\n return false\n }\n\n return true\n })\n\n const changedCount = section.fields.filter((field) => {\n return changedFieldKeys.value.has(field.key)\n }).length\n\n return { ...section, visibleFields, changedCount }\n })\n})\n\nwatchEffect(() => {\n const current = sectionStates.value.find((section) => {\n return section.key === activeSection.value && section.visibleFields.length\n })\n\n if (current) return\n\n activeSection.value =\n sectionStates.value.find((section) => section.visibleFields.length)?.key ??\n THEME_SECTIONS[0]!.key\n})\n\nconst activeState = computed(() => {\n return (\n sectionStates.value.find((section) => section.key === activeSection.value) ??\n sectionStates.value[0]\n )\n})\n\nfunction createThemeSnapshot(theme: Theme): Theme {\n return JSON.parse(JSON.stringify(theme)) as Theme\n}\n\nfunction getByPath(source: Record<string, any>, path: string[]) {\n return path.reduce((current, key) => current?.[key], source)\n}\n\nfunction setByPath(source: Record<string, any>, path: string[], value: any) {\n let current = source\n\n path.slice(0, -1).forEach((key) => {\n current = current[key]\n })\n\n current[path[path.length - 1]!] = value\n}\n\nfunction getCssVarName(path: string[]) {\n return `--u-${path.join('-')}`\n}\n\nfunction getThemePath(path: string[]) {\n return path.reduce((expression, key) => {\n if (/^[A-Za-z_$][\\w$]*$/.test(key)) {\n return `${expression}.${key}`\n }\n\n return `${expression}['${key}']`\n }, 'theme')\n}\n\nfunction getFieldComponent(field: ThemeField) {\n switch (field.kind) {\n case 'number':\n return UNumberInput\n case 'select':\n return USelect\n default:\n return UInput\n }\n}\n\nfunction getFieldValue(field: ThemeField) {\n return getByPath(editorTheme.value?.theme ?? lightTheme.theme, field.path)\n}\n\nfunction getFieldProps(field: ThemeField) {\n switch (field.kind) {\n case 'number':\n return { min: field.min, max: field.max, step: field.step, suffix: field.suffix }\n case 'select':\n return { options: field.options, clearable: false, placeholder: '请选择' }\n case 'input':\n return { placeholder: field.placeholder }\n default:\n return {}\n }\n}\n\nfunction updateField(field: ThemeField, value: string | number | undefined) {\n if (!editorTheme.value) return\n\n const normalizedValue =\n field.kind === 'number'\n ? typeof value === 'number'\n ? value\n : Number(value || 0)\n : String(value ?? '')\n\n setByPath(editorTheme.value.theme, field.path, normalizedValue)\n editorTheme.value.render()\n}\n\nfunction isFieldChanged(field: ThemeField) {\n return changedFieldKeys.value.has(field.key)\n}\n\nfunction applySnapshot(snapshot: Theme, label?: string) {\n if (!editorTheme.value) return\n\n Object.assign(editorTheme.value.theme, createThemeSnapshot(snapshot))\n baselineTheme.value = createThemeSnapshot(editorTheme.value.theme)\n\n if (label) {\n baselineLabel.value = label\n }\n\n editorTheme.value.render()\n}\n\nfunction applyPreset(type: 'light' | 'dark') {\n if (editorTheme.value) {\n editorTheme.value.series = type\n }\n applySnapshot(\n type === 'dark' ? darkPreset : lightPreset,\n type === 'dark' ? '深色预设' : '浅色预设'\n )\n}\n\nfunction handleResetTheme() {\n if (!editorTheme.value) return\n\n Object.assign(editorTheme.value.theme, createThemeSnapshot(baselineTheme.value))\n editorTheme.value.render()\n}\n\nfunction handleExportTheme() {\n if (!editorTheme.value) return\n\n const themeConfig = JSON.stringify(createThemeSnapshot(editorTheme.value.theme), null, 2)\n const blob = new Blob([themeConfig], { type: 'application/json' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = 'theme-config.json'\n a.click()\n URL.revokeObjectURL(url)\n}\n\ndefineExpose<_ThemeExposed>({\n reset: handleResetTheme,\n exportTheme: handleExportTheme,\n applyLightPreset: () => applyPreset('light'),\n applyDarkPreset: () => applyPreset('dark')\n})\n</script>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"theme.js","names":["UNumberInput","USelect","UInput","_openBlock","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_toDisplayString","_createVNode","_Fragment","_renderList","_createTextVNode","_createCommentVNode","UPalette","_withCtx","_normalizeStyle","_createBlock","_resolveDynamicComponent","_mergeProps","UButton"],"sources":["../../../src/components/theme/theme.vue"],"sourcesContent":["<template>\n <div :class=\"cls.b\">\n <div :class=\"cls.e('header')\">\n <div :class=\"cls.e('header-copy')\">\n <strong>主题变量配置</strong>\n </div>\n <div :class=\"cls.e('tags')\">\n <span :class=\"cls.e('tag')\">基线 {{ baselineLabel }}</span>\n <span :class=\"cls.e('tag')\">{{ changedFieldKeys.size }} 改动</span>\n </div>\n </div>\n\n <div :class=\"cls.e('toolbar')\">\n <u-input\n v-model=\"keyword\"\n :class=\"cls.e('search')\"\n placeholder=\"搜索变量名、中文标签或分组\"\n />\n\n <button\n type=\"button\"\n :class=\"[cls.e('toggle'), bem.is('active', changedOnly)]\"\n @click=\"changedOnly = !changedOnly\"\n >\n {{ changedOnly ? '查看全部' : '仅看改动' }}\n </button>\n </div>\n\n <div :class=\"cls.e('body')\">\n <div :class=\"cls.e('nav')\">\n <button\n v-for=\"section in sectionStates\"\n :key=\"section.key\"\n type=\"button\"\n :class=\"[\n cls.e('nav-item'),\n bem.is('active', activeSection === section.key),\n bem.is('disabled', !section.visibleFields.length)\n ]\"\n @click=\"activeSection = section.key\"\n >\n <span :class=\"cls.e('nav-main')\">{{ section.title }}</span>\n <span :class=\"cls.e('nav-meta')\">\n {{ section.visibleFields.length }}/{{ section.fields.length }}\n <template v-if=\"section.changedCount\"> · {{ section.changedCount }} 改动 </template>\n </span>\n </button>\n </div>\n\n <div :class=\"cls.e('panel')\">\n <div v-if=\"activeState\" :class=\"cls.e('panel-head')\">\n <div>\n <h4 :class=\"cls.e('panel-title')\">{{ activeState.title }}</h4>\n <p :class=\"cls.e('panel-desc')\">{{ activeState.description }}</p>\n </div>\n\n <div :class=\"cls.e('panel-count')\">{{ activeState.visibleFields.length }} 项</div>\n </div>\n\n <div v-if=\"activeState?.visibleFields.length\" :class=\"cls.e('list')\">\n <div\n v-for=\"field in activeState.visibleFields\"\n :key=\"field.key\"\n :class=\"[cls.e('item'), bem.is('changed', isFieldChanged(field))]\"\n >\n <div :class=\"cls.e('item-head')\">\n <div :class=\"cls.e('item-copy')\">\n <label :class=\"cls.e('item-label')\">{{ field.label }}</label>\n <div :class=\"cls.e('item-meta')\">\n <span :class=\"cls.e('item-code-label')\">Theme</span>\n <code :class=\"cls.e('item-code')\">{{ getThemePath(field.path) }}</code>\n </div>\n <div :class=\"cls.e('item-meta')\">\n <span :class=\"cls.e('item-code-label')\">CSS</span>\n <code :class=\"cls.e('item-code')\">{{ getCssVarName(field.path) }}</code>\n </div>\n </div>\n\n <span v-if=\"isFieldChanged(field)\" :class=\"cls.e('item-badge')\"> 已修改 </span>\n </div>\n\n <div v-if=\"field.kind === 'palette'\" :class=\"cls.e('palette-field')\">\n <template v-if=\"field.path[0] === 'color'\">\n <div :class=\"cls.e('palette-custom')\">\n <u-palette\n :model-value=\"String(getFieldValue(field) ?? '')\"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n <u-input\n :model-value=\"String(getFieldValue(field) ?? '')\"\n placeholder=\"例如:#1E88E5\"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n </div>\n </template>\n <template v-else>\n <div :class=\"cls.e('palette-custom')\">\n <u-palette\n :model-value=\"\n String(getFieldValue(field) ?? '').startsWith('var')\n ? ''\n : String(getFieldValue(field) ?? '')\n \"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n <u-input\n :model-value=\"String(getFieldValue(field) ?? '')\"\n placeholder=\"输入颜色或变量\"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n </div>\n <div :class=\"cls.e('palette-var')\">\n <span :class=\"cls.e('palette-var-label')\">或选择变量</span>\n <u-select\n :model-value=\"\n String(getFieldValue(field) ?? '').startsWith('var')\n ? String(getFieldValue(field) ?? '')\n : ''\n \"\n :options=\"colorVarOptions\"\n clearable\n placeholder=\"选择预设变量\"\n @update:model-value=\"(value) => updateField(field, value ?? '')\"\n >\n <template #default=\"{ option }\">\n <div style=\"display: flex; align-items: center; gap: 8px\">\n <div\n :style=\"`width: 14px; height: 14px; border-radius: 4px; background: ${option.value}`\"\n />\n <span style=\"font-size: 13px\">{{ option.label }}</span>\n </div>\n </template>\n </u-select>\n </div>\n </template>\n </div>\n\n <component\n v-else\n :is=\"getFieldComponent(field)\"\n :model-value=\"getFieldValue(field)\"\n v-bind=\"getFieldProps(field)\"\n @update:model-value=\"(value) => updateField(field, value)\"\n />\n\n <p v-if=\"field.hint || field.placeholder\" :class=\"cls.e('item-hint')\">\n {{ field.hint ?? field.placeholder }}\n </p>\n </div>\n </div>\n\n <div v-else :class=\"cls.e('empty')\">\n <strong>没有匹配项</strong>\n <p>换一个关键字,或关闭“仅看改动”后再继续筛选。</p>\n </div>\n </div>\n </div>\n\n <div :class=\"cls.e('actions')\">\n <div :class=\"cls.e('preset-group')\">\n <button type=\"button\" :class=\"cls.e('preset')\" @click=\"applyPreset('light')\">\n 浅色预设\n </button>\n <button type=\"button\" :class=\"cls.e('preset')\" @click=\"applyPreset('dark')\">\n 深色预设\n </button>\n </div>\n\n <u-button :class=\"cls.e('action-btn')\" @click=\"handleResetTheme\"> 重置 </u-button>\n <u-button :class=\"cls.e('action-btn')\" type=\"primary\" @click=\"handleExportTheme\">\n 导出\n </u-button>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport {\n type Theme,\n UITheme,\n currentTheme,\n darkTheme,\n lightTheme,\n loadTheme\n} from '@veltra/styles/theme'\nimport { bem } from '@veltra/utils'\nimport { computed, shallowRef, watch, watchEffect } from 'vue'\n\nimport type { ThemeProps, _ThemeExposed } from '../../types'\nimport { UButton } from '../button'\nimport { UInput } from '../input'\nimport { UNumberInput } from '../number-input'\nimport { UPalette } from '../palette'\nimport { USelect } from '../select'\nimport { THEME_SECTIONS } from './schema'\nimport type { ThemeField } from './schema'\n\ndefineOptions({ name: 'UTheme' })\n\nconst props = defineProps<ThemeProps>()\n\nconst cls = bem('theme')\n\nconst keyword = shallowRef('')\nconst changedOnly = shallowRef(false)\nconst activeSection = shallowRef(THEME_SECTIONS[0]!.key)\n\nconst colorVarOptions = computed(() => {\n const options: { label: string; value: string }[] = []\n THEME_SECTIONS.forEach((section) => {\n section.fields.forEach((field) => {\n if (field.kind === 'palette') {\n const varName = `var(${getCssVarName(field.path)})`\n options.push({ label: `${field.label}`, value: varName })\n }\n })\n })\n return options\n})\n\nconst editorTheme = shallowRef<UITheme>()\nconst baselineTheme = shallowRef<Theme>(createThemeSnapshot(lightTheme.theme))\nconst baselineLabel = shallowRef('浅色预设')\n\nconst lightPreset = createThemeSnapshot(lightTheme.theme)\nconst darkPreset = createThemeSnapshot(darkTheme.theme)\n\nconst sourceTheme = computed(() => {\n return props.theme ?? currentTheme.value ?? lightTheme\n})\n\nwatch(\n sourceTheme,\n (theme) => {\n if (!props.theme && theme === editorTheme.value) return\n\n const nextTheme = props.theme\n ? theme\n : new UITheme(createThemeSnapshot(theme.theme), { series: theme.series })\n\n editorTheme.value = nextTheme\n baselineTheme.value = createThemeSnapshot(nextTheme.theme)\n baselineLabel.value =\n theme === darkTheme\n ? '深色预设'\n : theme === lightTheme\n ? '浅色预设'\n : props.theme\n ? '外部主题'\n : '当前主题'\n\n if (!props.theme && currentTheme.value !== nextTheme) {\n loadTheme(nextTheme)\n }\n },\n { immediate: true }\n)\n\nconst changedFieldKeys = computed(() => {\n const keys = new Set<string>()\n\n THEME_SECTIONS.forEach((section) => {\n section.fields.forEach((field) => {\n if (\n getByPath(editorTheme.value?.theme ?? lightTheme.theme, field.path) !==\n getByPath(baselineTheme.value, field.path)\n ) {\n keys.add(field.key)\n }\n })\n })\n\n return keys\n})\n\nconst sectionStates = computed(() => {\n const normalizedKeyword = keyword.value.trim().toLowerCase()\n\n return THEME_SECTIONS.map((section) => {\n const sectionMatched = `${section.title} ${section.description}`\n .toLowerCase()\n .includes(normalizedKeyword)\n\n const visibleFields = section.fields.filter((field) => {\n const matchesKeyword =\n !normalizedKeyword ||\n sectionMatched ||\n `${field.label} ${field.key} ${getThemePath(field.path)} ${getCssVarName(field.path)}`\n .toLowerCase()\n .includes(normalizedKeyword)\n\n if (!matchesKeyword) return false\n\n if (changedOnly.value && !changedFieldKeys.value.has(field.key)) {\n return false\n }\n\n return true\n })\n\n const changedCount = section.fields.filter((field) => {\n return changedFieldKeys.value.has(field.key)\n }).length\n\n return { ...section, visibleFields, changedCount }\n })\n})\n\nwatchEffect(() => {\n const current = sectionStates.value.find((section) => {\n return section.key === activeSection.value && section.visibleFields.length\n })\n\n if (current) return\n\n activeSection.value =\n sectionStates.value.find((section) => section.visibleFields.length)?.key ??\n THEME_SECTIONS[0]!.key\n})\n\nconst activeState = computed(() => {\n return (\n sectionStates.value.find((section) => section.key === activeSection.value) ??\n sectionStates.value[0]\n )\n})\n\nfunction createThemeSnapshot(theme: Theme): Theme {\n return JSON.parse(JSON.stringify(theme)) as Theme\n}\n\nfunction getByPath(source: Record<string, any>, path: string[]) {\n return path.reduce((current, key) => current?.[key], source)\n}\n\nfunction setByPath(source: Record<string, any>, path: string[], value: any) {\n let current = source\n\n path.slice(0, -1).forEach((key) => {\n current = current[key]\n })\n\n current[path[path.length - 1]!] = value\n}\n\nfunction getCssVarName(path: string[]) {\n return `--u-${path.join('-')}`\n}\n\nfunction getThemePath(path: string[]) {\n return path.reduce((expression, key) => {\n if (/^[A-Za-z_$][\\w$]*$/.test(key)) {\n return `${expression}.${key}`\n }\n\n return `${expression}['${key}']`\n }, 'theme')\n}\n\nfunction getFieldComponent(field: ThemeField) {\n switch (field.kind) {\n case 'number':\n return UNumberInput\n case 'select':\n return USelect\n default:\n return UInput\n }\n}\n\nfunction getFieldValue(field: ThemeField) {\n return getByPath(editorTheme.value?.theme ?? lightTheme.theme, field.path)\n}\n\nfunction getFieldProps(field: ThemeField) {\n switch (field.kind) {\n case 'number':\n return { min: field.min, max: field.max, step: field.step, suffix: field.suffix }\n case 'select':\n return { options: field.options, clearable: false, placeholder: '请选择' }\n case 'input':\n return { placeholder: field.placeholder }\n default:\n return {}\n }\n}\n\nfunction updateField(field: ThemeField, value: string | number | undefined) {\n if (!editorTheme.value) return\n\n const normalizedValue =\n field.kind === 'number'\n ? typeof value === 'number'\n ? value\n : Number(value || 0)\n : String(value ?? '')\n\n setByPath(editorTheme.value.theme, field.path, normalizedValue)\n editorTheme.value.render()\n}\n\nfunction isFieldChanged(field: ThemeField) {\n return changedFieldKeys.value.has(field.key)\n}\n\nfunction applySnapshot(snapshot: Theme, label?: string) {\n if (!editorTheme.value) return\n\n Object.assign(editorTheme.value.theme, createThemeSnapshot(snapshot))\n baselineTheme.value = createThemeSnapshot(editorTheme.value.theme)\n\n if (label) {\n baselineLabel.value = label\n }\n\n editorTheme.value.render()\n}\n\nfunction applyPreset(type: 'light' | 'dark') {\n if (editorTheme.value) {\n editorTheme.value.series = type\n }\n applySnapshot(\n type === 'dark' ? darkPreset : lightPreset,\n type === 'dark' ? '深色预设' : '浅色预设'\n )\n}\n\nfunction handleResetTheme() {\n if (!editorTheme.value) return\n\n Object.assign(editorTheme.value.theme, createThemeSnapshot(baselineTheme.value))\n editorTheme.value.render()\n}\n\nfunction handleExportTheme() {\n if (!editorTheme.value) return\n\n const themeConfig = JSON.stringify(createThemeSnapshot(editorTheme.value.theme), null, 2)\n const blob = new Blob([themeConfig], { type: 'application/json' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = 'theme-config.json'\n a.click()\n URL.revokeObjectURL(url)\n}\n\ndefineExpose<_ThemeExposed>({\n reset: handleResetTheme,\n exportTheme: handleExportTheme,\n applyLightPreset: () => applyPreset('light'),\n applyDarkPreset: () => applyPreset('dark')\n})\n</script>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tip.js","names":[],"sources":["../../../src/components/tip/tip.vue"],"sourcesContent":["<template>\n <!-- 触发 -->\n <UNodeRender v-bind=\"eventsHandlers\" :content=\"renderDefaultSlotTrigger()\" ref=\"triggerRef\" />\n\n <!-- 弹出内容 -->\n <teleport :to=\"`#${popperContainerId}`\">\n <transition name=\"tip\">\n <component\n v-if=\"tipVisible\"\n :is=\"contentTag\"\n :class=\"contentClass\"\n :style=\"[style, { zIndex: zIndex() }]\"\n ref=\"contentRef\"\n @mouseenter=\"eventsHandlers.onMouseenter\"\n @mouseleave=\"eventsHandlers.onMouseleave\"\n @click.stop\n v-click-outside=\"handleClickOutside\"\n >\n <UNodeRender v-if=\"externalNode\" :content=\"externalNode\" />\n\n <slot name=\"content\">{{ content }}</slot>\n\n <div :class=\"cls.e('arrow')\" v-if=\"!hideArrow\" ref=\"arrowRef\"></div>\n </component>\n </transition>\n </teleport>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps, usePop } from '@veltra/compositions'\nimport { vClickOutside } from '@veltra/directives'\nimport { bem, extractNormalVNodes, zIndex } from '@veltra/utils'\nimport { shallowRef, computed, useSlots, onBeforeUnmount, toRef, watch, nextTick } from 'vue'\n\nimport type { TipProps, ComponentSize, TipEmits } from '../../types'\nimport { UNodeRender } from '../node-render'\nimport { useNest } from './use-nest'\n\ndefineOptions({ name: 'UTip' })\n\nconst props = withDefaults(defineProps<TipProps>(), {\n content: '',\n trigger: 'hover',\n direction: 'top',\n alignment: 'center',\n contentTag: 'div',\n visible: undefined,\n showDelay: 0\n})\n\nconst emit = defineEmits<TipEmits>()\n\nconst cls = bem('tip')\nconst slots = useSlots()\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst contentClass = computed(() => {\n const fixed = [cls.e('content'), cls.m(size.value), props.type && cls.m('color-' + props.type)]\n const className = props.class\n if (!Array.isArray(className)) {\n return [...fixed, className]\n }\n return [...fixed, ...className]\n})\n\nconst triggerRef = shallowRef<InstanceType<typeof UNodeRender>>()\nconst contentRef = shallowRef<HTMLElement>()\nconst arrowRef = shallowRef<HTMLElement>()\n\nconst _visible = shallowRef(false)\n\nconst visible = computed(() => {\n return props.visible !== undefined ? props.visible : _visible.value\n})\n\nfunction updateVisible(v: boolean) {\n if (props.visible === undefined) {\n _visible.value = v\n } else {\n emit('update:visible', v)\n }\n}\n\nconst tipVisible = useNest(visible)\n\nfunction renderDefaultSlotTrigger() {\n const nodes = slots.default?.()\n if (!nodes?.length) return null\n return extractNormalVNodes(nodes)[0]\n}\n\nconst eventsHandlers = computed(() => {\n const { trigger, disabled } = props\n\n const handlers: Record<string, Function> = {}\n\n if (disabled) return handlers\n\n if (trigger === 'click') {\n handlers.onClick = open\n } else if (trigger === 'hover') {\n handlers.onMouseenter = open\n handlers.onMouseleave = close\n }\n\n return handlers\n})\n\nconst handleClickOutside = (e: MouseEvent) => {\n if (props.trigger === 'hover') return\n\n // 点击的元素在触发元素中则啥也\n if (props.trigger === 'click' && triggerDom.value.contains(e.target as Node)) {\n return\n }\n close()\n}\n\nlet openTimer: ReturnType<typeof setTimeout> | undefined\nlet closeTimer: ReturnType<typeof setTimeout> | undefined\n\nfunction clearOpenTimer() {\n if (openTimer !== undefined) {\n clearTimeout(openTimer)\n openTimer = undefined\n }\n}\n\nfunction clearCloseTimer() {\n if (closeTimer !== undefined) {\n clearTimeout(closeTimer)\n closeTimer = undefined\n }\n}\n\n/** 弹出 */\nconst open = (e?: PointerEvent) => {\n e?.stopPropagation()\n clearCloseTimer()\n\n const delay = props.trigger === 'hover' ? props.showDelay : 0\n if (delay <= 0) {\n clearOpenTimer()\n updateVisible(true)\n return\n }\n\n clearOpenTimer()\n openTimer = setTimeout(() => {\n openTimer = undefined\n updateVisible(true)\n }, delay)\n}\n/** 关闭 */\nconst close = () => {\n clearOpenTimer()\n\n if (props.trigger === 'hover') {\n closeTimer = setTimeout(() => {\n closeTimer = undefined\n updateVisible(false)\n }, 250)\n } else {\n updateVisible(false)\n }\n}\n\nconst triggerDom = computed(() => {\n return props.triggerDom || triggerRef.value?.$el\n})\n\nconst { update, popperContainerId } = usePop({\n triggerRef: triggerDom,\n contentRef,\n arrowRef,\n direction: toRef(() => props.direction),\n alignment: toRef(() => props.alignment),\n onTriggerPositionChange() {\n close()\n }\n})\n\nwatch(triggerDom, (dom) => {\n // TODO: 看起来不是很优雅\n if (dom?.nodeType === Node.ELEMENT_NODE && visible.value) {\n nextTick(() => {\n void update()\n })\n }\n})\n\n/** 外部节点 */\nconst externalNode = shallowRef<any>()\n\nonBeforeUnmount(() => {\n clearOpenTimer()\n clearCloseTimer()\n})\n</script>\n"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tip.js","names":["_openBlock","_createElementBlock","_Fragment","_createCommentVNode","_createVNode","_unref","UNodeRender","_mergeProps","_createBlock","_Teleport","_Transition","_withCtx","_withDirectives","_resolveDynamicComponent","_normalizeClass","_normalizeStyle","_withModifiers","_renderSlot","_createTextVNode","_toDisplayString"],"sources":["../../../src/components/tip/tip.vue"],"sourcesContent":["<template>\n <!-- 触发 -->\n <UNodeRender v-bind=\"eventsHandlers\" :content=\"renderDefaultSlotTrigger()\" ref=\"triggerRef\" />\n\n <!-- 弹出内容 -->\n <teleport :to=\"`#${popperContainerId}`\">\n <transition name=\"tip\">\n <component\n v-if=\"tipVisible\"\n :is=\"contentTag\"\n :class=\"contentClass\"\n :style=\"[style, { zIndex: zIndex() }]\"\n ref=\"contentRef\"\n @mouseenter=\"eventsHandlers.onMouseenter\"\n @mouseleave=\"eventsHandlers.onMouseleave\"\n @click.stop\n v-click-outside=\"handleClickOutside\"\n >\n <UNodeRender v-if=\"externalNode\" :content=\"externalNode\" />\n\n <slot name=\"content\">{{ content }}</slot>\n\n <div :class=\"cls.e('arrow')\" v-if=\"!hideArrow\" ref=\"arrowRef\"></div>\n </component>\n </transition>\n </teleport>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps, usePop } from '@veltra/compositions'\nimport { vClickOutside } from '@veltra/directives'\nimport { bem, extractNormalVNodes, zIndex } from '@veltra/utils'\nimport { shallowRef, computed, useSlots, onBeforeUnmount, toRef, watch, nextTick } from 'vue'\n\nimport type { TipProps, ComponentSize, TipEmits } from '../../types'\nimport { UNodeRender } from '../node-render'\nimport { useNest } from './use-nest'\n\ndefineOptions({ name: 'UTip' })\n\nconst props = withDefaults(defineProps<TipProps>(), {\n content: '',\n trigger: 'hover',\n direction: 'top',\n alignment: 'center',\n contentTag: 'div',\n visible: undefined,\n showDelay: 0\n})\n\nconst emit = defineEmits<TipEmits>()\n\nconst cls = bem('tip')\nconst slots = useSlots()\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst contentClass = computed(() => {\n const fixed = [cls.e('content'), cls.m(size.value), props.type && cls.m('color-' + props.type)]\n const className = props.class\n if (!Array.isArray(className)) {\n return [...fixed, className]\n }\n return [...fixed, ...className]\n})\n\nconst triggerRef = shallowRef<InstanceType<typeof UNodeRender>>()\nconst contentRef = shallowRef<HTMLElement>()\nconst arrowRef = shallowRef<HTMLElement>()\n\nconst _visible = shallowRef(false)\n\nconst visible = computed(() => {\n return props.visible !== undefined ? props.visible : _visible.value\n})\n\nfunction updateVisible(v: boolean) {\n if (props.visible === undefined) {\n _visible.value = v\n } else {\n emit('update:visible', v)\n }\n}\n\nconst tipVisible = useNest(visible)\n\nfunction renderDefaultSlotTrigger() {\n const nodes = slots.default?.()\n if (!nodes?.length) return null\n return extractNormalVNodes(nodes)[0]\n}\n\nconst eventsHandlers = computed(() => {\n const { trigger, disabled } = props\n\n const handlers: Record<string, Function> = {}\n\n if (disabled) return handlers\n\n if (trigger === 'click') {\n handlers.onClick = open\n } else if (trigger === 'hover') {\n handlers.onMouseenter = open\n handlers.onMouseleave = close\n }\n\n return handlers\n})\n\nconst handleClickOutside = (e: MouseEvent) => {\n if (props.trigger === 'hover') return\n\n // 点击的元素在触发元素中则啥也\n if (props.trigger === 'click' && triggerDom.value.contains(e.target as Node)) {\n return\n }\n close()\n}\n\nlet openTimer: ReturnType<typeof setTimeout> | undefined\nlet closeTimer: ReturnType<typeof setTimeout> | undefined\n\nfunction clearOpenTimer() {\n if (openTimer !== undefined) {\n clearTimeout(openTimer)\n openTimer = undefined\n }\n}\n\nfunction clearCloseTimer() {\n if (closeTimer !== undefined) {\n clearTimeout(closeTimer)\n closeTimer = undefined\n }\n}\n\n/** 弹出 */\nconst open = (e?: PointerEvent) => {\n e?.stopPropagation()\n clearCloseTimer()\n\n const delay = props.trigger === 'hover' ? props.showDelay : 0\n if (delay <= 0) {\n clearOpenTimer()\n updateVisible(true)\n return\n }\n\n clearOpenTimer()\n openTimer = setTimeout(() => {\n openTimer = undefined\n updateVisible(true)\n }, delay)\n}\n/** 关闭 */\nconst close = () => {\n clearOpenTimer()\n\n if (props.trigger === 'hover') {\n closeTimer = setTimeout(() => {\n closeTimer = undefined\n updateVisible(false)\n }, 250)\n } else {\n updateVisible(false)\n }\n}\n\nconst triggerDom = computed(() => {\n return props.triggerDom || triggerRef.value?.$el\n})\n\nconst { update, popperContainerId } = usePop({\n triggerRef: triggerDom,\n contentRef,\n arrowRef,\n direction: toRef(() => props.direction),\n alignment: toRef(() => props.alignment),\n onTriggerPositionChange() {\n close()\n }\n})\n\nwatch(triggerDom, (dom) => {\n // TODO: 看起来不是很优雅\n if (dom?.nodeType === Node.ELEMENT_NODE && visible.value) {\n nextTick(() => {\n void update()\n })\n }\n})\n\n/** 外部节点 */\nconst externalNode = shallowRef<any>()\n\nonBeforeUnmount(() => {\n clearOpenTimer()\n clearCloseTimer()\n})\n</script>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-node.js","names":[],"sources":["../../../src/components/tree/tree-node.vue"],"sourcesContent":["<template>\n <div\n :class=\"[cls.e('node'), bem.is('expanded', node.expanded), bem.is('disabled', node.disabled)]\"\n :ref=\"measureRef\"\n >\n <span v-for=\"i in node.depth\" :key=\"i\" :class=\"cls.e('indent')\" aria-hidden=\"true\"></span>\n\n <u-icon v-if=\"!node.isLeaf\" :class=\"cls.e('expand-icon')\" @click.stop=\"toggleExpand\">\n <ArrowRight />\n </u-icon>\n <u-icon v-else :class=\"cls.e('leaf-icon')\" aria-hidden=\"true\">\n <Dot />\n </u-icon>\n\n <div\n :class=\"cls.e('node-content')\"\n @click=\"handleClick\"\n @contextmenu=\"treeEmit('node-contextmenu', $event, node)\"\n v-ripple=\"\n (treeProps.selectable || (treeProps.checkable && treeProps.checkOnClickNode)) &&\n !node.disabled\n ? cls.e('ripple')\n : false\n \"\n >\n <u-checkbox\n v-if=\"treeProps.checkable\"\n :class=\"cls.e('checkbox')\"\n :model-value=\"node.checked\"\n :indeterminate=\"!treeProps.checkStrictly && node.indeterminate\"\n :disabled=\"node.disabled\"\n @change=\"handleChange\"\n @click.stop\n />\n\n <u-node-render :content=\"getTreeSlotsNode({ node, data: node.data })\" />\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { vRipple } from '@veltra/directives'\nimport { ArrowRight, Dot } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { inject } from 'vue'\n\nimport type { TreeNodeProps } from '../../types'\nimport UCheckbox from '../checkbox/checkbox.vue'\nimport { UIcon } from '../icon'\nimport { UNodeRender } from '../node-render'\nimport { TreeDIKey } from './di'\n\ndefineOptions({ name: 'UTreeNode' })\n\nconst props = defineProps<TreeNodeProps>()\n\nconst { treeProps, treeEmit, cls, getTreeSlotsNode, getFlattedNodes, toggleCheck, handleSelect } =\n inject(TreeDIKey)!\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\nfunction toggleExpand() {\n const { node } = props\n node.expanded = !node.expanded\n getFlattedNodes()\n\n treeEmit('expand', node)\n}\n\nfunction handleChange(checked: boolean, e: MouseEvent) {\n toggleCheck(props.node, checked, e.ctrlKey)\n}\n\nfunction handleClick(e: MouseEvent) {\n const { node } = props\n treeEmit('node-click', node)\n\n treeProps.selectable && handleSelect(node)\n treeProps.expandOnClickNode && toggleExpand()\n treeProps.checkable &&\n treeProps.checkOnClickNode &&\n !node.disabled &&\n !treeProps.expandOnClickNode &&\n toggleCheck(node, !node.checked, e.ctrlKey)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;EAsDA,MAAM,QAAQ;EAEd,MAAM,EAAE,WAAW,UAAU,KAAK,kBAAkB,iBAAiB,aAAa,iBAChF,OAAO,SAAS;EAElB,SAAS,WAAW,IAAa;GAC/B,IAAI,OAAO,MAAM,UAAU,YAAY,CAAC,MAAM,gBAAgB;GAC9D,MAAM,eAAe,MAAM,OAAO,EAAoB;EACxD;EAEA,SAAS,eAAe;GACtB,MAAM,EAAE,SAAS;GACjB,KAAK,WAAW,CAAC,KAAK;GACtB,gBAAgB;GAEhB,SAAS,UAAU,IAAI;EACzB;EAEA,SAAS,aAAa,SAAkB,GAAe;GACrD,YAAY,MAAM,MAAM,SAAS,EAAE,OAAO;EAC5C;EAEA,SAAS,YAAY,GAAe;GAClC,MAAM,EAAE,SAAS;GACjB,SAAS,cAAc,IAAI;GAE3B,UAAU,cAAc,aAAa,IAAI;GACzC,UAAU,qBAAqB,aAAa;GAC5C,UAAU,aACR,UAAU,oBACV,CAAC,KAAK,YACN,CAAC,UAAU,qBACX,YAAY,MAAM,CAAC,KAAK,SAAS,EAAE,OAAO;EAC9C;;GAtFE,
|
|
1
|
+
{"version":3,"file":"tree-node.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_Fragment","_renderList","_createBlock","UIcon","_withModifiers","_withCtx","_createVNode","_withDirectives","UCheckbox","_createCommentVNode","UNodeRender"],"sources":["../../../src/components/tree/tree-node.vue"],"sourcesContent":["<template>\n <div\n :class=\"[cls.e('node'), bem.is('expanded', node.expanded), bem.is('disabled', node.disabled)]\"\n :ref=\"measureRef\"\n >\n <span v-for=\"i in node.depth\" :key=\"i\" :class=\"cls.e('indent')\" aria-hidden=\"true\"></span>\n\n <u-icon v-if=\"!node.isLeaf\" :class=\"cls.e('expand-icon')\" @click.stop=\"toggleExpand\">\n <ArrowRight />\n </u-icon>\n <u-icon v-else :class=\"cls.e('leaf-icon')\" aria-hidden=\"true\">\n <Dot />\n </u-icon>\n\n <div\n :class=\"cls.e('node-content')\"\n @click=\"handleClick\"\n @contextmenu=\"treeEmit('node-contextmenu', $event, node)\"\n v-ripple=\"\n (treeProps.selectable || (treeProps.checkable && treeProps.checkOnClickNode)) &&\n !node.disabled\n ? cls.e('ripple')\n : false\n \"\n >\n <u-checkbox\n v-if=\"treeProps.checkable\"\n :class=\"cls.e('checkbox')\"\n :model-value=\"node.checked\"\n :indeterminate=\"!treeProps.checkStrictly && node.indeterminate\"\n :disabled=\"node.disabled\"\n @change=\"handleChange\"\n @click.stop\n />\n\n <u-node-render :content=\"getTreeSlotsNode({ node, data: node.data })\" />\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { vRipple } from '@veltra/directives'\nimport { ArrowRight, Dot } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { inject } from 'vue'\n\nimport type { TreeNodeProps } from '../../types'\nimport UCheckbox from '../checkbox/checkbox.vue'\nimport { UIcon } from '../icon'\nimport { UNodeRender } from '../node-render'\nimport { TreeDIKey } from './di'\n\ndefineOptions({ name: 'UTreeNode' })\n\nconst props = defineProps<TreeNodeProps>()\n\nconst { treeProps, treeEmit, cls, getTreeSlotsNode, getFlattedNodes, toggleCheck, handleSelect } =\n inject(TreeDIKey)!\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\nfunction toggleExpand() {\n const { node } = props\n node.expanded = !node.expanded\n getFlattedNodes()\n\n treeEmit('expand', node)\n}\n\nfunction handleChange(checked: boolean, e: MouseEvent) {\n toggleCheck(props.node, checked, e.ctrlKey)\n}\n\nfunction handleClick(e: MouseEvent) {\n const { node } = props\n treeEmit('node-click', node)\n\n treeProps.selectable && handleSelect(node)\n treeProps.expandOnClickNode && toggleExpand()\n treeProps.checkable &&\n treeProps.checkOnClickNode &&\n !node.disabled &&\n !treeProps.expandOnClickNode &&\n toggleCheck(node, !node.checked, e.ctrlKey)\n}\n</script>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree.js","names":[],"sources":["../../../src/components/tree/tree.vue"],"sourcesContent":["<template>\n <u-scroll\n :class=\"className\"\n ref=\"scrollRef\"\n :content-class=\"[cls.e('wrap'), bem.is('virtual', virtualEnabled)]\"\n >\n <template v-if=\"virtualEnabled\">\n <UTreeNode\n v-for=\"{ node, key, offset, index } of virtualNodes\"\n :node=\"node\"\n :key=\"key\"\n :class=\"bem.is('selected', node.data === selectedData)\"\n :index=\"index\"\n :measure-element=\"measureElement\"\n :style=\"{ transform: `translateY(${offset}px)` }\"\n />\n </template>\n <template v-else>\n <UTreeNode\n v-for=\"node of nodes\"\n :node=\"node\"\n :key=\"node.key\"\n :class=\"bem.is('selected', node.data === selectedData)\"\n />\n </template>\n\n <div :class=\"cls.e('empty')\" v-if=\"!nodes.length\">\n <UEmpty />\n </div>\n </u-scroll>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFormFallbackProps, useVirtualizer } from '@veltra/compositions'\nimport { bem, nextFrame, scrollIntoContainerView } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed, provide, shallowRef, useSlots, watch, watchEffect, type VNode } from 'vue'\n\nimport type { TreeProps, TreeEmit, _TreeExposed } from '../../types'\nimport type { ScrollExposed } from '../../types'\nimport { UEmpty } from '../empty'\nimport { UScroll } from '../scroll'\nimport { TreeDIKey, type TreeConText, type TreeSlotsScope } from './di'\nimport UTreeNode from './tree-node.vue'\nimport { useCheck } from './use-check'\nimport { useFilter } from './use-filter'\nimport { useSelect } from './use-select'\nimport { useTreeNodes } from './use-tree-nodes'\n\ndefineOptions({ name: 'UTree' })\n\nconst props = withDefaults(defineProps<TreeProps>(), {\n labelKey: 'label',\n valueKey: 'value',\n childrenKey: 'children',\n expandOnClickNode: false,\n checkOnClickNode: true,\n checkStrictly: false,\n data: () => []\n})\n\nconst emit = defineEmits<TreeEmit>()\n\nconst cls = bem('tree')\n\nconst { formProps } = injectFormContext()\n\nconst { size } = useFormFallbackProps([formProps ?? {}, props], { size: 'default' })\n\nconst scrollRef = shallowRef<ScrollExposed>()\n\nconst className = computed(() => {\n return [\n cls.b,\n cls.m(size.value),\n bem.is('selectable', props.selectable),\n bem.is('checkable', props.checkable)\n ]\n})\n\ndefineSlots<{ default: (props: TreeSlotsScope) => any }>()\n\nconst slots = useSlots()\n\nfunction getTreeSlotsNode(ctx: TreeSlotsScope): VNode[] | string | undefined {\n return (props.slots?.default ?? slots.default)?.(ctx) ?? ctx.node.label\n}\n\nconst { nodes, forest, getFlattedNodes, nodeDict } = useTreeNodes({ props })\n\nwatch(\n [() => props.selectable, () => props.checkable, forest],\n ([s, c]) => {\n // 如果选择或勾选,则不更新节点\n if (s || c) return\n getFlattedNodes()\n },\n { immediate: true }\n)\n\nconst { filter } = useFilter({ forest, getFlattedNodes })\n\nconst { handleSelect, selectedData } = useSelect({ props, emit, nodeDict, getFlattedNodes })\n\nconst { checkedData, toggleCheck, checkAll } = useCheck({\n props,\n emit,\n forest,\n nodeDict,\n getFlattedNodes\n})\n\nconst estimateSize = (): number => {\n // 基于 style.scss 中节点稳态高度推算的默认值;\n // 实际高度仍由 `measureElement` 通过 ResizeObserver 回填覆盖。\n switch (size.value) {\n case 'small':\n return 32\n case 'large':\n return 44\n default:\n return 36\n }\n}\n\n// 80 阈值内化为消费者侧语义;低于此值时不启用虚拟化。\nconst virtualEnabled = computed(() => nodes.value.length > 80)\n\nconst { virtualizer, items } = useVirtualizer({\n count: computed(() => nodes.value.length),\n scrollEl: () => scrollRef.value?.containerRef ?? null,\n // 仅在虚拟化启用时把内容容器的 height 撑开到 totalSize;\n // 关闭时传 null,hook 会清除此前写入的内联 height,回到 CSS 默认。\n contentEl: () => (virtualEnabled.value ? (scrollRef.value?.contentRef ?? null) : null),\n estimateSize,\n gap: 2,\n // 以节点稳定 key 作为虚拟项身份,展开 / 收起 / 过滤引起的 nodes 数组变更\n // 保留未移动节点的真实测量值,避免再次滚动首屏抖动。\n getItemKey: (i) => nodes.value[i]?.key ?? i\n})\n\n// 身份稳定性已由底层 `getItemKey` 保证;直接以 `node.key` 作为 Vue 层 key。\n// `item.index` 仅作为 nodes / snapshot 竞态边缘的 fallback。\nconst virtualNodes = computed(() => {\n const _nodes = nodes.value\n return items.value.map((item) => {\n const node = _nodes[item.index]!\n return { node, key: node?.key ?? item.index, offset: item.start, index: item.index }\n })\n})\n\nconst measureElement: (index: number, el: Element | null) => void = (index, el) =>\n virtualizer.measureElement(index, el)\n\nfunction scrollTo(index: number): void {\n virtualizer.scrollToIndex(index, { align: 'center' })\n}\n\nfunction scrollIntoView() {\n const { selectable, checkable, scrollToView } = props\n if (!scrollToView || (!selectable && !checkable) || !nodes.value) return\n let index = -1\n\n if (selectable) {\n if (!selectedData.value) return\n index = nodes.value.findIndex((node) => node.data === selectedData.value)\n } else if (checkable) {\n if (!checkedData.size) return\n index = nodes.value.findIndex((node) => checkedData.has(node.data))\n }\n\n if (virtualEnabled.value) {\n scrollTo(index)\n } else {\n const { contentRef, containerRef } = scrollRef.value ?? {}\n const el = contentRef?.children[index]\n el && scrollIntoContainerView(el as HTMLElement, containerRef ?? null)\n }\n}\n\nwatchEffect(() => {\n nextFrame(() => {\n scrollIntoView()\n })\n})\n\nprovide(TreeDIKey, {\n cls,\n selectedData,\n checkedData,\n getFlattedNodes,\n getTreeSlotsNode,\n treeEmit: emit as TreeEmit,\n treeProps: props as TreeProps,\n toggleCheck: toggleCheck as TreeConText['toggleCheck'],\n handleSelect: handleSelect as TreeConText['handleSelect']\n})\n\ndefineExpose<_TreeExposed>({\n filter,\n forest,\n nodes,\n checkNode: toggleCheck,\n selectNode: handleSelect,\n checkAll,\n getSelected() {\n return selectedData\n },\n getChecked() {\n return Array.from(checkedData)\n },\n scrollTo,\n\n expandAll() {\n forest.value.dfs((node) => {\n node.expanded = true\n })\n getFlattedNodes()\n },\n collapseAll() {\n forest.value.dfs((node) => {\n node.expanded = false\n })\n getFlattedNodes()\n }\n})\n</script>\n"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tree.js","names":["_openBlock","_createBlock","_unref","UScroll","_normalizeClass","_withCtx","_createElementBlock","_Fragment","_renderList","UTreeNode","_normalizeStyle","_createVNode","UEmpty","_createCommentVNode"],"sources":["../../../src/components/tree/tree.vue"],"sourcesContent":["<template>\n <u-scroll\n :class=\"className\"\n ref=\"scrollRef\"\n :content-class=\"[cls.e('wrap'), bem.is('virtual', virtualEnabled)]\"\n >\n <template v-if=\"virtualEnabled\">\n <UTreeNode\n v-for=\"{ node, key, offset, index } of virtualNodes\"\n :node=\"node\"\n :key=\"key\"\n :class=\"bem.is('selected', node.data === selectedData)\"\n :index=\"index\"\n :measure-element=\"measureElement\"\n :style=\"{ transform: `translateY(${offset}px)` }\"\n />\n </template>\n <template v-else>\n <UTreeNode\n v-for=\"node of nodes\"\n :node=\"node\"\n :key=\"node.key\"\n :class=\"bem.is('selected', node.data === selectedData)\"\n />\n </template>\n\n <div :class=\"cls.e('empty')\" v-if=\"!nodes.length\">\n <UEmpty />\n </div>\n </u-scroll>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFormFallbackProps, useVirtualizer } from '@veltra/compositions'\nimport { bem, nextFrame, scrollIntoContainerView } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed, provide, shallowRef, useSlots, watch, watchEffect, type VNode } from 'vue'\n\nimport type { TreeProps, TreeEmit, _TreeExposed } from '../../types'\nimport type { ScrollExposed } from '../../types'\nimport { UEmpty } from '../empty'\nimport { UScroll } from '../scroll'\nimport { TreeDIKey, type TreeConText, type TreeSlotsScope } from './di'\nimport UTreeNode from './tree-node.vue'\nimport { useCheck } from './use-check'\nimport { useFilter } from './use-filter'\nimport { useSelect } from './use-select'\nimport { useTreeNodes } from './use-tree-nodes'\n\ndefineOptions({ name: 'UTree' })\n\nconst props = withDefaults(defineProps<TreeProps>(), {\n labelKey: 'label',\n valueKey: 'value',\n childrenKey: 'children',\n expandOnClickNode: false,\n checkOnClickNode: true,\n checkStrictly: false,\n data: () => []\n})\n\nconst emit = defineEmits<TreeEmit>()\n\nconst cls = bem('tree')\n\nconst { formProps } = injectFormContext()\n\nconst { size } = useFormFallbackProps([formProps ?? {}, props], { size: 'default' })\n\nconst scrollRef = shallowRef<ScrollExposed>()\n\nconst className = computed(() => {\n return [\n cls.b,\n cls.m(size.value),\n bem.is('selectable', props.selectable),\n bem.is('checkable', props.checkable)\n ]\n})\n\ndefineSlots<{ default: (props: TreeSlotsScope) => any }>()\n\nconst slots = useSlots()\n\nfunction getTreeSlotsNode(ctx: TreeSlotsScope): VNode[] | string | undefined {\n return (props.slots?.default ?? slots.default)?.(ctx) ?? ctx.node.label\n}\n\nconst { nodes, forest, getFlattedNodes, nodeDict } = useTreeNodes({ props })\n\nwatch(\n [() => props.selectable, () => props.checkable, forest],\n ([s, c]) => {\n // 如果选择或勾选,则不更新节点\n if (s || c) return\n getFlattedNodes()\n },\n { immediate: true }\n)\n\nconst { filter } = useFilter({ forest, getFlattedNodes })\n\nconst { handleSelect, selectedData } = useSelect({ props, emit, nodeDict, getFlattedNodes })\n\nconst { checkedData, toggleCheck, checkAll } = useCheck({\n props,\n emit,\n forest,\n nodeDict,\n getFlattedNodes\n})\n\nconst estimateSize = (): number => {\n // 基于 style.scss 中节点稳态高度推算的默认值;\n // 实际高度仍由 `measureElement` 通过 ResizeObserver 回填覆盖。\n switch (size.value) {\n case 'small':\n return 32\n case 'large':\n return 44\n default:\n return 36\n }\n}\n\n// 80 阈值内化为消费者侧语义;低于此值时不启用虚拟化。\nconst virtualEnabled = computed(() => nodes.value.length > 80)\n\nconst { virtualizer, items } = useVirtualizer({\n count: computed(() => nodes.value.length),\n scrollEl: () => scrollRef.value?.containerRef ?? null,\n // 仅在虚拟化启用时把内容容器的 height 撑开到 totalSize;\n // 关闭时传 null,hook 会清除此前写入的内联 height,回到 CSS 默认。\n contentEl: () => (virtualEnabled.value ? (scrollRef.value?.contentRef ?? null) : null),\n estimateSize,\n gap: 2,\n // 以节点稳定 key 作为虚拟项身份,展开 / 收起 / 过滤引起的 nodes 数组变更\n // 保留未移动节点的真实测量值,避免再次滚动首屏抖动。\n getItemKey: (i) => nodes.value[i]?.key ?? i\n})\n\n// 身份稳定性已由底层 `getItemKey` 保证;直接以 `node.key` 作为 Vue 层 key。\n// `item.index` 仅作为 nodes / snapshot 竞态边缘的 fallback。\nconst virtualNodes = computed(() => {\n const _nodes = nodes.value\n return items.value.map((item) => {\n const node = _nodes[item.index]!\n return { node, key: node?.key ?? item.index, offset: item.start, index: item.index }\n })\n})\n\nconst measureElement: (index: number, el: Element | null) => void = (index, el) =>\n virtualizer.measureElement(index, el)\n\nfunction scrollTo(index: number): void {\n virtualizer.scrollToIndex(index, { align: 'center' })\n}\n\nfunction scrollIntoView() {\n const { selectable, checkable, scrollToView } = props\n if (!scrollToView || (!selectable && !checkable) || !nodes.value) return\n let index = -1\n\n if (selectable) {\n if (!selectedData.value) return\n index = nodes.value.findIndex((node) => node.data === selectedData.value)\n } else if (checkable) {\n if (!checkedData.size) return\n index = nodes.value.findIndex((node) => checkedData.has(node.data))\n }\n\n if (virtualEnabled.value) {\n scrollTo(index)\n } else {\n const { contentRef, containerRef } = scrollRef.value ?? {}\n const el = contentRef?.children[index]\n el && scrollIntoContainerView(el as HTMLElement, containerRef ?? null)\n }\n}\n\nwatchEffect(() => {\n nextFrame(() => {\n scrollIntoView()\n })\n})\n\nprovide(TreeDIKey, {\n cls,\n selectedData,\n checkedData,\n getFlattedNodes,\n getTreeSlotsNode,\n treeEmit: emit as TreeEmit,\n treeProps: props as TreeProps,\n toggleCheck: toggleCheck as TreeConText['toggleCheck'],\n handleSelect: handleSelect as TreeConText['handleSelect']\n})\n\ndefineExpose<_TreeExposed>({\n filter,\n forest,\n nodes,\n checkNode: toggleCheck,\n selectNode: handleSelect,\n checkAll,\n getSelected() {\n return selectedData\n },\n getChecked() {\n return Array.from(checkedData)\n },\n scrollTo,\n\n expandAll() {\n forest.value.dfs((node) => {\n node.expanded = true\n })\n getFlattedNodes()\n },\n collapseAll() {\n forest.value.dfs((node) => {\n node.expanded = false\n })\n getFlattedNodes()\n }\n})\n</script>\n"],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
|
|
|
15
15
|
__name: "tree-select",
|
|
16
16
|
props: /*@__PURE__*/ mergeModels({
|
|
17
17
|
modelValue: {},
|
|
18
|
+
text: {},
|
|
18
19
|
data: {},
|
|
19
20
|
placeholder: { default: "请选择" },
|
|
20
21
|
clearable: {
|
|
@@ -77,6 +78,7 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
|
|
|
77
78
|
"placeholder",
|
|
78
79
|
"disabled",
|
|
79
80
|
"label",
|
|
81
|
+
"text",
|
|
80
82
|
"readonly",
|
|
81
83
|
"data",
|
|
82
84
|
"contentClass",
|
|
@@ -120,8 +122,13 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
|
|
|
120
122
|
treeRef.value?.filter(query);
|
|
121
123
|
}, { immediate: true });
|
|
122
124
|
const model = useModel(__props, "modelValue");
|
|
123
|
-
/** 内部展示文案,仅由 data
|
|
125
|
+
/** 内部展示文案,仅由 data 推导(未命中时展示 text 兜底);经 update:text 通知父级 */
|
|
124
126
|
const label = shallowRef();
|
|
127
|
+
/** 展示文案:data 推导优先,未命中时回退 text 兜底 */
|
|
128
|
+
const displayText = computed(() => {
|
|
129
|
+
if (!(model.value || model.value === 0)) return void 0;
|
|
130
|
+
return label.value ?? props.text;
|
|
131
|
+
});
|
|
125
132
|
const dropdownVisible = shallowRef(false);
|
|
126
133
|
/**
|
|
127
134
|
* 是否处于查询态:决定触发输入框显示查询串还是选中标签。
|
|
@@ -130,21 +137,20 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
|
|
|
130
137
|
*/
|
|
131
138
|
const querying = shallowRef(false);
|
|
132
139
|
const inputRef = useTemplateRef("inputRef");
|
|
133
|
-
/**
|
|
140
|
+
/** 更新内部文案;值变化时 emit update:text(readonly 纯展示,不通知父级) */
|
|
134
141
|
function setLabel(next) {
|
|
135
142
|
if (label.value === next) return;
|
|
136
143
|
label.value = next;
|
|
137
|
-
emit("update:text", next);
|
|
144
|
+
if (!readonly.value) emit("update:text", next);
|
|
138
145
|
}
|
|
139
146
|
/** 触发输入框的值:查询态下承载查询串,否则展示选中标签 */
|
|
140
147
|
const inputValue = computed(() => {
|
|
141
148
|
if (filterable.value && querying.value) return qs.value;
|
|
142
|
-
return
|
|
149
|
+
return displayText.value;
|
|
143
150
|
});
|
|
144
151
|
/** 查询态下已选标签降级为占位提示 */
|
|
145
152
|
const inputPlaceholder = computed(() => {
|
|
146
|
-
|
|
147
|
-
if (filterable.value && querying.value && display) return display;
|
|
153
|
+
if (filterable.value && querying.value && displayText.value) return displayText.value;
|
|
148
154
|
return props.placeholder;
|
|
149
155
|
});
|
|
150
156
|
function handleQueryInput(value) {
|
|
@@ -155,7 +161,7 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
|
|
|
155
161
|
/** 悬停且存在选中值时展示清除按钮(替代下拉箭头) */
|
|
156
162
|
const showClear = computed(() => {
|
|
157
163
|
if (!props.clearable || disabled.value || !hovered.value) return false;
|
|
158
|
-
return !!
|
|
164
|
+
return !!displayText.value;
|
|
159
165
|
});
|
|
160
166
|
/**
|
|
161
167
|
* 过滤模式下拦截输入区域的点击:
|
|
@@ -188,10 +194,11 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
|
|
|
188
194
|
/** 外部回显:按 data 查找 label(O(n));用户动作期内跳过 */
|
|
189
195
|
watch([treeData, model], ([data, modelVal]) => {
|
|
190
196
|
if (isUserActive()) return;
|
|
191
|
-
if (
|
|
197
|
+
if (modelVal === void 0 || modelVal === null || modelVal === "") {
|
|
192
198
|
setLabel(void 0);
|
|
193
199
|
return;
|
|
194
200
|
}
|
|
201
|
+
if (!data?.length) return;
|
|
195
202
|
let nextLabel;
|
|
196
203
|
const childrenKey = props.childrenKey ?? "children";
|
|
197
204
|
data.some((item) => {
|
|
@@ -205,7 +212,9 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
|
|
|
205
212
|
}, childrenKey);
|
|
206
213
|
return founded;
|
|
207
214
|
});
|
|
208
|
-
setLabel(nextLabel);
|
|
215
|
+
if (nextLabel !== void 0) setLabel(nextLabel);
|
|
216
|
+
else if (props.text) label.value = void 0;
|
|
217
|
+
else setLabel(void 0);
|
|
209
218
|
}, { immediate: true });
|
|
210
219
|
/** 用户选择:O(1) 写入值与文案,跳过 data 回显查找 */
|
|
211
220
|
const handleSelect = userAction((selected, selectedData) => {
|
|
@@ -313,7 +322,7 @@ const _sfc_main = /*@__PURE__*/ defineComponent({
|
|
|
313
322
|
"min-width",
|
|
314
323
|
"width",
|
|
315
324
|
"disabled"
|
|
316
|
-
])) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [createTextVNode(toDisplayString(
|
|
325
|
+
])) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [createTextVNode(toDisplayString(displayText.value || unref(FORM_EMPTY_CONTENT)), 1)], 64));
|
|
317
326
|
};
|
|
318
327
|
}
|
|
319
328
|
});
|