@veltra/desktop 1.8.2 → 1.8.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/action/action-group.js.map +1 -1
- package/dist/components/action/action-group.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/action/action.js.map +1 -1
- package/dist/components/auto-complete/auto-complete.js.map +1 -1
- package/dist/components/badge/badge.js.map +1 -1
- package/dist/components/batch-edit/batch-edit-form.js.map +1 -1
- package/dist/components/batch-edit/batch-edit-list.js.map +1 -1
- package/dist/components/batch-edit/batch-edit.js.map +1 -1
- package/dist/components/breadcrumb/breadcrumb.js.map +1 -1
- package/dist/components/button/button-group.js.map +1 -1
- package/dist/components/button/button.js.map +1 -1
- package/dist/components/calendar/calendar.js.map +1 -1
- package/dist/components/card/card-action.js.map +1 -1
- package/dist/components/card/card-content.js.map +1 -1
- package/dist/components/card/card-cover.js.map +1 -1
- package/dist/components/card/card-header.js.map +1 -1
- package/dist/components/card/card.js.map +1 -1
- package/dist/components/cascade/cascade-panel-item.js.map +1 -1
- package/dist/components/cascade/cascade.js +1 -0
- package/dist/components/cascade/cascade.js.map +1 -1
- package/dist/components/cascade/use-select.js +6 -2
- package/dist/components/cascade/use-select.js.map +1 -1
- package/dist/components/check-tag/check-tag.js.map +1 -1
- package/dist/components/checkbox/checkbox-button.js.map +1 -1
- package/dist/components/checkbox/checkbox.js.map +1 -1
- package/dist/components/checkbox-group/checkbox-group.js.map +1 -1
- package/dist/components/code-editor/code-editor.js.map +1 -1
- package/dist/components/collapse/collapse-item.js.map +1 -1
- package/dist/components/collapse/collapse.js.map +1 -1
- package/dist/components/condition-editor/components/condition-group.js.map +1 -1
- package/dist/components/condition-editor/components/condition-row.js.map +1 -1
- package/dist/components/condition-editor/condition-editor.js.map +1 -1
- package/dist/components/contextmenu/contextmenu-item.js.map +1 -1
- package/dist/components/contextmenu/contextmenu-panel.js.map +1 -1
- package/dist/components/contextmenu/contextmenu-sub.js.map +1 -1
- package/dist/components/contextmenu/contextmenu.js.map +1 -1
- package/dist/components/date-panel/date-panel.js.map +1 -1
- package/dist/components/date-panel/headers/day.js.map +1 -1
- package/dist/components/date-panel/headers/month.js.map +1 -1
- package/dist/components/date-panel/headers/year.js.map +1 -1
- package/dist/components/date-panel/panels/day.js.map +1 -1
- package/dist/components/date-panel/panels/month.js.map +1 -1
- package/dist/components/date-panel/panels/year.js.map +1 -1
- package/dist/components/date-picker/date-picker.js.map +1 -1
- package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
- package/dist/components/dialog/dialog.js.map +1 -1
- package/dist/components/drawer/drawer.js.map +1 -1
- package/dist/components/dropdown/dropdown.js.map +1 -1
- package/dist/components/dual-nav/dual-nav-app.js.map +1 -1
- package/dist/components/dual-nav/dual-nav.js.map +1 -1
- package/dist/components/empty/empty.js.map +1 -1
- package/dist/components/expression-editor/components/path-preview.js.map +1 -1
- package/dist/components/expression-editor/components/variable-picker.js.map +1 -1
- package/dist/components/expression-editor/expression-editor.js.map +1 -1
- package/dist/components/file-picker/file-picker.js.map +1 -1
- package/dist/components/file-viewer/file-viewer.js.map +1 -1
- package/dist/components/file-viewer/previewers/docx-previewer.js.map +1 -1
- package/dist/components/file-viewer/previewers/image-previewer.js.map +1 -1
- package/dist/components/file-viewer/previewers/ofd-previewer.js.map +1 -1
- package/dist/components/file-viewer/previewers/pdf-previewer.js.map +1 -1
- package/dist/components/file-viewer/previewers/pdf-viewport-scroll.js.map +1 -1
- package/dist/components/file-viewer/previewers/pdf-zoom-bridge.js.map +1 -1
- package/dist/components/file-viewer/previewers/sheet-previewer.js.map +1 -1
- package/dist/components/file-viewer/previewers/text-previewer.js.map +1 -1
- package/dist/components/file-viewer/previewers/video-previewer.js.map +1 -1
- package/dist/components/float-button/float-button.js.map +1 -1
- package/dist/components/form/form.js.map +1 -1
- package/dist/components/form/form.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/form-item/form-item.js.map +1 -1
- package/dist/components/form-item/form-item.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/gantt-chart/gantt-chart.js.map +1 -1
- package/dist/components/grid/grid-item.js.map +1 -1
- package/dist/components/grid/grid.js.map +1 -1
- package/dist/components/grid-input/grid-input.js.map +1 -1
- package/dist/components/group-input/group-input.js.map +1 -1
- package/dist/components/group-nav/group-nav-item.js.map +1 -1
- package/dist/components/group-nav/group-nav.js.map +1 -1
- package/dist/components/icon/icon.js.map +1 -1
- package/dist/components/image-cropper/image-cropper.js.map +1 -1
- package/dist/components/input/input.js.map +1 -1
- package/dist/components/input/input.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/kanban/kanban-column.js.map +1 -1
- package/dist/components/kanban/kanban.js.map +1 -1
- package/dist/components/kbd/kbd.js.map +1 -1
- package/dist/components/layout/layout-resizer.js.map +1 -1
- package/dist/components/layout/layout.js.map +1 -1
- package/dist/components/list/list-item.js.map +1 -1
- package/dist/components/list/list.js.map +1 -1
- package/dist/components/loading/loading.js.map +1 -1
- package/dist/components/message/message-box.js.map +1 -1
- package/dist/components/message/message.js.map +1 -1
- package/dist/components/message-confirm/message-confirm-box.js.map +1 -1
- package/dist/components/message-confirm/message-confirm.js.map +1 -1
- package/dist/components/multi-select/multi-select-option.js.map +1 -1
- package/dist/components/multi-select/multi-select.js.map +1 -1
- package/dist/components/multi-tree-select/multi-tree-select.js.map +1 -1
- package/dist/components/nav/nav-icon.js.map +1 -1
- package/dist/components/nav/nav-item-collapsed.js.map +1 -1
- package/dist/components/nav/nav-item.js.map +1 -1
- package/dist/components/nav/nav-sub-collapsed.js.map +1 -1
- package/dist/components/nav/nav-sub.js.map +1 -1
- package/dist/components/nav/nav.js.map +1 -1
- package/dist/components/notification/notification-box.js.map +1 -1
- package/dist/components/notification/notification.js.map +1 -1
- package/dist/components/number/number.js.map +1 -1
- package/dist/components/number-input/number-input.js.map +1 -1
- package/dist/components/number-range-input/number-range-input.js.map +1 -1
- package/dist/components/paginator/paginator.js.map +1 -1
- package/dist/components/palette/palette-alpha.js.map +1 -1
- package/dist/components/palette/palette-color-switch.js.map +1 -1
- package/dist/components/palette/palette-hue.js.map +1 -1
- package/dist/components/palette/palette-sv.js.map +1 -1
- package/dist/components/palette/palette.js.map +1 -1
- package/dist/components/password-input/password-input.js.map +1 -1
- package/dist/components/pop-confirm/pop-confirm.js.map +1 -1
- package/dist/components/progress/progress.js.map +1 -1
- package/dist/components/progress-nodes/progress-nodes.js.map +1 -1
- package/dist/components/radio/radio.js.map +1 -1
- package/dist/components/radio-group/radio-group.js.map +1 -1
- package/dist/components/rich-text-editor/image-node.js +53 -14
- package/dist/components/rich-text-editor/image-node.js.map +1 -1
- package/dist/components/rich-text-editor/rich-text-editor.js +9 -3
- package/dist/components/rich-text-editor/rich-text-editor.js.map +1 -1
- package/dist/components/rich-text-editor/style2.css +31 -0
- package/dist/components/rich-text-editor/toolbar.js.map +1 -1
- package/dist/components/rich-text-editor/use-image-resize.js +118 -0
- package/dist/components/rich-text-editor/use-image-resize.js.map +1 -0
- package/dist/components/scroll/scroll-bar.js.map +1 -1
- package/dist/components/scroll/scroll.js.map +1 -1
- package/dist/components/segment/segment.js.map +1 -1
- package/dist/components/select/select.js +9 -5
- package/dist/components/select/select.js.map +1 -1
- package/dist/components/slider/slider-thumb.js.map +1 -1
- package/dist/components/slider/slider.js.map +1 -1
- package/dist/components/steps/steps.js.map +1 -1
- package/dist/components/switch/switch.js.map +1 -1
- package/dist/components/table/table-body.js.map +1 -1
- package/dist/components/table/table-cell.js.map +1 -1
- package/dist/components/table/table-foot.js.map +1 -1
- package/dist/components/table/table-head.js.map +1 -1
- package/dist/components/table/table-row.js.map +1 -1
- package/dist/components/table/table.js.map +1 -1
- package/dist/components/table-editor/table-editor.js.map +1 -1
- package/dist/components/tabs/tabs-horizontal.js.map +1 -1
- package/dist/components/tabs/tabs-vertical.js.map +1 -1
- package/dist/components/tabs/tabs.js.map +1 -1
- package/dist/components/tag/tag.js.map +1 -1
- package/dist/components/text/text.js.map +1 -1
- package/dist/components/textarea/textarea.js.map +1 -1
- package/dist/components/theme/theme.js.map +1 -1
- package/dist/components/tip/tip.js.map +1 -1
- package/dist/components/tree/tree-node.js.map +1 -1
- package/dist/components/tree/tree.js.map +1 -1
- package/dist/components/tree-select/tree-select.js +19 -10
- package/dist/components/tree-select/tree-select.js.map +1 -1
- package/dist/components/watermark/watermark.js.map +1 -1
- package/dist/types/cascade.d.ts +5 -0
- package/dist/types/select.d.ts +8 -2
- package/dist/types/tree-select.d.ts +8 -2
- package/package.json +18 -18
- package/src/components/batch-edit/__test__/batch-edit.test.ts +1 -1
- package/src/components/button/__test__/button.test.ts +1 -1
- package/src/components/cascade/__test__/cascade.test.ts +26 -1
- package/src/components/cascade/use-select.ts +5 -5
- package/src/components/collapse/__test__/collapse.test.ts +1 -1
- package/src/components/condition-editor/__test__/condition-editor.test.ts +1 -1
- package/src/components/contextmenu/__test__/contextmenu.test.ts +1 -1
- package/src/components/date-picker/__test__/date-picker.test.ts +1 -1
- package/src/components/date-range-picker/__test__/date-range-picker.test.ts +1 -1
- package/src/components/drawer/__test__/drawer.test.ts +1 -1
- package/src/components/expression-editor/__test__/chip.test.ts +1 -1
- package/src/components/expression-editor/__test__/editor.test.ts +1 -1
- package/src/components/expression-editor/__test__/expression-editor.test.ts +1 -1
- package/src/components/expression-editor/__test__/mention.test.ts +1 -1
- package/src/components/expression-editor/__test__/model.test.ts +1 -1
- package/src/components/file-viewer/__test__/helper.test.ts +1 -1
- package/src/components/form/__test__/form.test.ts +1 -1
- package/src/components/form/__test__/is-field-modified.test.ts +1 -1
- package/src/components/form-item/__test__/form-item.test.ts +1 -1
- package/src/components/image-cropper/__test__/draw-crop.test.ts +1 -1
- package/src/components/image-cropper/__test__/image-cropper.test.ts +1 -1
- package/src/components/image-cropper/__test__/use-transform.test.ts +1 -1
- package/src/components/kanban/__test__/kanban.test.ts +1 -1
- package/src/components/message-confirm/__test__/message-confirm.test.ts +1 -1
- package/src/components/multi-tree-select/__test__/multi-tree-select.test.ts +1 -1
- package/src/components/number-input/__test__/number-input.test.ts +1 -1
- package/src/components/number-range-input/__test__/number-range-input.test.ts +1 -1
- package/src/components/palette/__test__/color-transform.test.ts +1 -1
- package/src/components/palette/__test__/palette.test.ts +1 -1
- package/src/components/password-input/__test__/password-input.test.ts +1 -1
- package/src/components/radio-group/__test__/radio-group.test.ts +1 -1
- package/src/components/rich-text-editor/__test__/image-node.test.ts +140 -0
- package/src/components/rich-text-editor/image-node.ts +84 -15
- package/src/components/rich-text-editor/rich-text-editor.vue +15 -4
- package/src/components/rich-text-editor/style.scss +35 -0
- package/src/components/rich-text-editor/use-image-resize.ts +168 -0
- package/src/components/segment/__test__/segment.test.ts +1 -1
- package/src/components/select/__test__/select.test.ts +68 -1
- package/src/components/select/select.vue +15 -5
- package/src/components/table/__test__/col-width.test.ts +1 -1
- package/src/components/table/__test__/column-style.test.ts +1 -1
- package/src/components/table-editor/__test__/table-editor.test.ts +1 -1
- package/src/components/tree-select/__test__/tree-select.test.ts +50 -1
- package/src/components/tree-select/tree-select.vue +28 -11
- package/src/types/cascade.ts +5 -0
- package/src/types/select.ts +8 -2
- package/src/types/tree-select.ts +9 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nav-item.js","names":[],"sources":["../../../src/components/nav/nav-item.vue"],"sourcesContent":["<template>\n <li\n :class=\"[\n cls.e('item'),\n bem.is('first-level', depth === 0),\n bem.is('active', active),\n bem.is('disabled', item.disabled ?? false)\n ]\"\n ref=\"item\"\n @click=\"handleClickItem\"\n >\n <NavIcon v-if=\"item.icon\" :icon=\"item.icon\" :class=\"cls.e('icon')\" />\n\n <!-- 文本 -->\n <span :class=\"cls.e('item-title')\">\n {{ item.title }}\n </span>\n </li>\n</template>\n\n<script setup lang=\"ts\">\nimport { bem } from '@veltra/utils'\nimport { useTemplateRef } from 'vue'\n\nimport type { NavItem } from '../../types'\nimport NavIcon from './nav-icon.vue'\nimport { useNavItem } from './use-nav-item'\n\ndefineOptions({ name: 'UNavItem' })\n\nconst props = defineProps<{ item: NavItem; depth: number }>()\n\nconst itemRef = useTemplateRef('item')\n\nconst { cls, active, handleClickItem } = useNavItem({ itemProps: props, itemRef })\n</script>\n"],"mappings":";;;;;;;;;;;;;EA8BA,MAAM,QAAQ;EAEd,MAAM,UAAU,eAAe,MAAM;EAErC,MAAM,EAAE,KAAK,QAAQ,oBAAoB,WAAW;GAAE,WAAW;GAAO;EAAQ,CAAC;;GAjC/E,
|
|
1
|
+
{"version":3,"file":"nav-item.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_createBlock","NavIcon","_createCommentVNode","_createElementVNode","_toDisplayString"],"sources":["../../../src/components/nav/nav-item.vue"],"sourcesContent":["<template>\n <li\n :class=\"[\n cls.e('item'),\n bem.is('first-level', depth === 0),\n bem.is('active', active),\n bem.is('disabled', item.disabled ?? false)\n ]\"\n ref=\"item\"\n @click=\"handleClickItem\"\n >\n <NavIcon v-if=\"item.icon\" :icon=\"item.icon\" :class=\"cls.e('icon')\" />\n\n <!-- 文本 -->\n <span :class=\"cls.e('item-title')\">\n {{ item.title }}\n </span>\n </li>\n</template>\n\n<script setup lang=\"ts\">\nimport { bem } from '@veltra/utils'\nimport { useTemplateRef } from 'vue'\n\nimport type { NavItem } from '../../types'\nimport NavIcon from './nav-icon.vue'\nimport { useNavItem } from './use-nav-item'\n\ndefineOptions({ name: 'UNavItem' })\n\nconst props = defineProps<{ item: NavItem; depth: number }>()\n\nconst itemRef = useTemplateRef('item')\n\nconst { cls, active, handleClickItem } = useNavItem({ itemProps: props, itemRef })\n</script>\n"],"mappings":";;;;;;;;;;;;;EA8BA,MAAM,QAAQ;EAEd,MAAM,UAAU,eAAe,MAAM;EAErC,MAAM,EAAE,KAAK,QAAQ,oBAAoB,WAAW;GAAE,WAAW;GAAO;EAAQ,CAAC;;GAjC/E,OAAAA,UAAA,GAAAC,mBAgBK,MAAA;IAfF,OAAKC,eAAA;KAAUC,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA;KAAgBA,MAAA,GAAA,CAAG,CAAC,GAAE,eAAgB,QAAA,UAAK,CAAA;KAAeA,MAAA,GAAA,CAAG,CAAC,GAAE,UAAWA,MAAA,MAAA,CAAM;KAASA,MAAA,GAAA,CAAG,CAAC,GAAE,YAAa,QAAA,KAAK,YAAQ,KAAA;;IAM/I,KAAI;IACH,SAAK,OAAA,OAAA,OAAA,MAAE,GAAA,SAAAA,MAAA,eAAA,KAAAA,MAAA,eAAA,CAAA,CAAA,GAAA,IAAA;;IAEO,QAAA,KAAK,QAApBH,UAAA,GAAAI,YAAqEC,aAAA;;KAA1C,MAAM,QAAA,KAAK;KAAO,OAAKH,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA,CAAA;;IAEzDG,mBAAA,MAAA;IACAC,mBAEO,QAAA,EAFA,OAAKL,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,YAAA,CAAA,EACd,GAAAK,gBAAA,QAAA,KAAK,KAAK,GAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nav-sub-collapsed.js","names":[],"sources":["../../../src/components/nav/nav-sub-collapsed.vue"],"sourcesContent":["<template>\n <u-tip\n hide-arrow\n direction=\"right\"\n alignment=\"start\"\n :class=\"[collapsedCls.m(size), collapsedCls.e('panel')]\"\n style=\"padding: 0\"\n v-model:visible=\"visible\"\n >\n <li :class=\"[collapsedCls.e('sub-content'), bem.is('first-level', depth === 0)]\">\n <NavIcon v-if=\"item.icon\" :icon=\"item.icon\" :class=\"collapsedCls.e('icon')\" />\n\n <span v-else>{{ item.title[0] }}</span>\n\n <template v-if=\"depth !== 0\">\n <span :class=\"collapsedCls.e('sub-title')\">\n {{ item.title }}\n </span>\n\n <!-- 展开图标 -->\n <u-icon :class=\"[collapsedCls.e('sub-expand')]\">\n <ArrowRight />\n </u-icon>\n </template>\n </li>\n\n <template #content>\n <u-scroll tag=\"ul\" :class=\"collapsedCls.e('sub-list')\">\n <template v-for=\"(child, index) of item.children!\" :key=\"getKey(index, parentKey)\">\n <UNavItemCollapsed\n v-if=\"!child.children?.length\"\n :item=\"child\"\n :depth=\"depth + 1\"\n @click=\"closeSubMenu\"\n />\n\n <NavSubCollapsed\n v-else\n :item=\"child\"\n :parent-key=\"getKey(index, parentKey)\"\n :depth=\"depth + 1\"\n />\n </template>\n </u-scroll>\n </template>\n </u-tip>\n</template>\n\n<script setup lang=\"ts\">\nimport { ArrowRight } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { inject, ref } from 'vue'\n\nimport type { NavItem } from '../../types'\nimport { UIcon } from '../icon'\nimport { UScroll } from '../scroll'\nimport { UTip } from '../tip'\nimport { NavDIKey } from './di'\nimport { getKey } from './helper'\nimport NavIcon from './nav-icon.vue'\nimport UNavItemCollapsed from './nav-item-collapsed.vue'\n\ndefineOptions({ name: 'UNavSubCollapsed' })\n\ndefineProps<{ item: NavItem; parentKey: string; depth: number }>()\n\nconst visible = ref(false)\n\nfunction closeSubMenu() {\n visible.value = false\n}\n\nconst { collapsedCls, size } = inject(NavDIKey)!\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;EAkEA,MAAM,UAAU,IAAI,KAAK;EAEzB,SAAS,eAAe;GACtB,QAAQ,QAAQ;EAClB;EAEA,MAAM,EAAE,cAAc,SAAS,OAAO,QAAQ;;;GAvE5C,
|
|
1
|
+
{"version":3,"file":"nav-sub-collapsed.js","names":["_resolveComponent","_openBlock","_createBlock","_unref","UTip","_normalizeClass","_withCtx","_createVNode","UScroll","_createElementBlock","_Fragment","_renderList","UNavItemCollapsed","_createElementVNode","NavIcon","_toDisplayString","_createCommentVNode","UIcon"],"sources":["../../../src/components/nav/nav-sub-collapsed.vue"],"sourcesContent":["<template>\n <u-tip\n hide-arrow\n direction=\"right\"\n alignment=\"start\"\n :class=\"[collapsedCls.m(size), collapsedCls.e('panel')]\"\n style=\"padding: 0\"\n v-model:visible=\"visible\"\n >\n <li :class=\"[collapsedCls.e('sub-content'), bem.is('first-level', depth === 0)]\">\n <NavIcon v-if=\"item.icon\" :icon=\"item.icon\" :class=\"collapsedCls.e('icon')\" />\n\n <span v-else>{{ item.title[0] }}</span>\n\n <template v-if=\"depth !== 0\">\n <span :class=\"collapsedCls.e('sub-title')\">\n {{ item.title }}\n </span>\n\n <!-- 展开图标 -->\n <u-icon :class=\"[collapsedCls.e('sub-expand')]\">\n <ArrowRight />\n </u-icon>\n </template>\n </li>\n\n <template #content>\n <u-scroll tag=\"ul\" :class=\"collapsedCls.e('sub-list')\">\n <template v-for=\"(child, index) of item.children!\" :key=\"getKey(index, parentKey)\">\n <UNavItemCollapsed\n v-if=\"!child.children?.length\"\n :item=\"child\"\n :depth=\"depth + 1\"\n @click=\"closeSubMenu\"\n />\n\n <NavSubCollapsed\n v-else\n :item=\"child\"\n :parent-key=\"getKey(index, parentKey)\"\n :depth=\"depth + 1\"\n />\n </template>\n </u-scroll>\n </template>\n </u-tip>\n</template>\n\n<script setup lang=\"ts\">\nimport { ArrowRight } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { inject, ref } from 'vue'\n\nimport type { NavItem } from '../../types'\nimport { UIcon } from '../icon'\nimport { UScroll } from '../scroll'\nimport { UTip } from '../tip'\nimport { NavDIKey } from './di'\nimport { getKey } from './helper'\nimport NavIcon from './nav-icon.vue'\nimport UNavItemCollapsed from './nav-item-collapsed.vue'\n\ndefineOptions({ name: 'UNavSubCollapsed' })\n\ndefineProps<{ item: NavItem; parentKey: string; depth: number }>()\n\nconst visible = ref(false)\n\nfunction closeSubMenu() {\n visible.value = false\n}\n\nconst { collapsedCls, size } = inject(NavDIKey)!\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;EAkEA,MAAM,UAAU,IAAI,KAAK;EAEzB,SAAS,eAAe;GACtB,QAAQ,QAAQ;EAClB;EAEA,MAAM,EAAE,cAAc,SAAS,OAAO,QAAQ;;;GAvE5C,OAAAC,UAAA,GAAAC,YA4CQC,MAAAC,WAAA,GAAA;IA3CN,cAAA;IACA,WAAU;IACV,WAAU;IACT,OAAKC,eAAA,CAAGF,MAAA,YAAA,CAAY,CAAC,EAAEA,MAAA,IAAA,CAAI,GAAGA,MAAA,YAAA,CAAY,CAAC,EAAC,OAAA,CAAA,CAAA;IAC7C,OAAA,EAAA,WAAA,IAAA;IACQ,SAAS,QAAA;IAAA,oBAAA,OAAA,OAAA,OAAA,MAAA,WAAA,QAAO,QAAA;;IAmBb,SAAOG,cAiBL,CAhBXC,YAgBWJ,MAAAK,WAAA,GAAA;KAhBD,KAAI;KAAM,OAAKH,eAAEF,MAAA,YAAA,CAAY,CAAC,EAAC,UAAA,CAAA;;KAC7B,SAAAG,cAAwC,EAAlDL,UAAA,IAAA,GAAAQ,mBAcWC,UAAA,MAAAC,WAdwB,QAAA,KAAK,WAAtB,OAAO,UAAK;MAA2B,OAAA,UAAA,GAAA,mBAAA,UAAA,EAAA,KAAAR,MAAA,MAAA,CAAM,CAAC,OAAO,QAAA,SAAS,EAAA,GAErE,CAAA,CAAA,MAAM,UAAU,UADzBF,UAAA,GAAAC,YAKEU,aAAA;;OAHC,MAAM;OACN,OAAO,QAAA,QAAK;OACZ,SAAO;MAGV,GAAA,MAAA,GAAA,CAAA,QAAA,OAAA,CAAA,MAAAX,UAAA,GAAAC,YAKE,4BAAA;;OAHC,MAAM;OACN,cAAYC,MAAA,MAAA,CAAM,CAAC,OAAO,QAAA,SAAS;OACnC,OAAO,QAAA,QAAK;;;;;;;;;IA/BrB,SAAAG,cAeK,CAfLO,mBAeK,MAAA,EAfA,OAAKR,eAAA,CAAGF,MAAA,YAAA,CAAY,CAAC,EAAC,aAAA,GAAiBA,MAAA,GAAA,CAAG,CAAC,GAAE,eAAgB,QAAA,UAAK,CAAA,CAAA,CAAA,EAAA,GACtD,CAAA,QAAA,KAAK,QAApBF,UAAA,GAAAC,YAA8EY,aAAA;;KAAnD,MAAM,QAAA,KAAK;KAAO,OAAKT,eAAEF,MAAA,YAAA,CAAY,CAAC,EAAC,MAAA,CAAA;IAElE,GAAA,MAAA,GAAA,CAAA,QAAA,OAAA,CAAA,MAAAF,UAAA,GAAAQ,mBAAuC,QAAA,YAAAM,gBAAvB,QAAA,KAAK,MAAK,EAAA,GAAA,CAAA,IAEV,QAAA,UAAK,KAArBd,UAAA,GAAAQ,mBASWC,UAAA,EAAA,KAAA,EAAA,GAAA;KARTG,mBAEO,QAAA,EAFA,OAAKR,eAAEF,MAAA,YAAA,CAAY,CAAC,EAAC,WAAA,CAAA,EACvB,GAAAY,gBAAA,QAAA,KAAK,KAAK,GAAA,CAAA;KAGfC,mBAAA,QAAA;KACAT,YAESJ,MAAAc,WAAA,GAAA,EAFA,OAAKZ,eAAA,CAAGF,MAAA,YAAA,CAAY,CAAC,EAAC,YAAA,CAAA,CAAA,EAAA,GAAA;MAC7B,SAAAG,cAAc,CAAdC,YAAcJ,MAAA,UAAA,CAAA,CAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nav-sub.js","names":[],"sources":["../../../src/components/nav/nav-sub.vue"],"sourcesContent":["<template>\n <li :class=\"cls.e('sub')\">\n <div\n :class=\"[\n cls.e('sub-content'),\n bem.is('first-level', depth === 0),\n bem.is('expanded', expanded),\n bem.is('branch-active', branchActive)\n ]\"\n @click=\"handleToggleExpand\"\n >\n <UNavIcon v-if=\"item.icon\" :icon=\"item.icon\" :class=\"cls.e('icon')\" />\n\n <!-- 文本 -->\n <span :class=\"cls.e('sub-title')\">\n {{ item.title }}\n </span>\n\n <!-- 展开图标 -->\n <u-icon :class=\"[cls.e('sub-expand'), bem.is('expanded', expanded)]\">\n <ArrowRight />\n </u-icon>\n </div>\n\n <!-- @vue-ignore -->\n <transition\n @enter=\"(el: Element) => expandTransition.enter(el as HTMLElement)\"\n @after-enter=\"(el: Element) => expandTransition.afterEnter(el as HTMLElement)\"\n @before-leave=\"(el: Element) => expandTransition.beforeLeave(el as HTMLElement)\"\n @leave=\"(el: Element) => expandTransition.leave(el as HTMLElement)\"\n @after-leave=\"(el: Element) => expandTransition.afterLeave(el as HTMLElement)\"\n >\n <ul :class=\"[cls.e('sub-list'), bem.is('has-active', branchActive)]\" v-show=\"expanded\">\n <template v-for=\"(child, index) of item.children!\" :key=\"getKey(index, parentKey)\">\n <UNavItem v-if=\"!child.children?.length\" :item=\"child\" :depth=\"depth + 1\" />\n <NavSub v-else :item=\"child\" :parent-key=\"getKey(index, parentKey)\" :depth=\"depth + 1\" />\n </template>\n </ul>\n </transition>\n </li>\n</template>\n\n<script setup lang=\"ts\">\nimport { ArrowRight } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed, inject } from 'vue'\n\nimport type { NavItem } from '../../types'\nimport { UIcon } from '../icon'\nimport { NavDIKey } from './di'\nimport { getKey } from './helper'\nimport UNavIcon from './nav-icon.vue'\nimport UNavItem from './nav-item.vue'\n\ndefineOptions({ name: 'UNavSub' })\n\nconst props = defineProps<{ item: NavItem; parentKey: string; depth: number }>()\n\nconst { cls, expandedPath, navProps, expandTransition } = inject(NavDIKey)!\n\nconst expanded = computed(() => expandedPath.has(props.item.path))\n\nconst branchActive = computed(() => {\n const currentPath = navProps.currentPath\n if (!currentPath) return false\n\n const check = (items?: NavItem[]) => {\n return items?.some((item) => item.path === currentPath || check(item.children)) ?? false\n }\n\n return check(props.item.children)\n})\n\nfunction handleToggleExpand() {\n const { item } = props\n expandedPath.has(item.path) ? expandedPath.delete(item.path) : expandedPath.add(item.path)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;EAwDA,MAAM,QAAQ;EAEd,MAAM,EAAE,KAAK,cAAc,UAAU,qBAAqB,OAAO,QAAQ;EAEzE,MAAM,WAAW,eAAe,aAAa,IAAI,MAAM,KAAK,IAAI,CAAC;EAEjE,MAAM,eAAe,eAAe;GAClC,MAAM,cAAc,SAAS;GAC7B,IAAI,CAAC,aAAa,OAAO;GAEzB,MAAM,SAAS,UAAsB;IACnC,OAAO,OAAO,MAAM,SAAS,KAAK,SAAS,eAAe,MAAM,KAAK,QAAQ,CAAC,KAAK;GACrF;GAEA,OAAO,MAAM,MAAM,KAAK,QAAQ;EAClC,CAAC;EAED,SAAS,qBAAqB;GAC5B,MAAM,EAAE,SAAS;GACjB,aAAa,IAAI,KAAK,IAAI,IAAI,aAAa,OAAO,KAAK,IAAI,IAAI,aAAa,IAAI,KAAK,IAAI;EAC3F;;;GA3EE,
|
|
1
|
+
{"version":3,"file":"nav-sub.js","names":["_resolveComponent","_openBlock","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_createBlock","UNavIcon","_createCommentVNode","_toDisplayString","_createVNode","UIcon","_withCtx","_Transition","_withDirectives","_Fragment","_renderList","UNavItem","_vShow"],"sources":["../../../src/components/nav/nav-sub.vue"],"sourcesContent":["<template>\n <li :class=\"cls.e('sub')\">\n <div\n :class=\"[\n cls.e('sub-content'),\n bem.is('first-level', depth === 0),\n bem.is('expanded', expanded),\n bem.is('branch-active', branchActive)\n ]\"\n @click=\"handleToggleExpand\"\n >\n <UNavIcon v-if=\"item.icon\" :icon=\"item.icon\" :class=\"cls.e('icon')\" />\n\n <!-- 文本 -->\n <span :class=\"cls.e('sub-title')\">\n {{ item.title }}\n </span>\n\n <!-- 展开图标 -->\n <u-icon :class=\"[cls.e('sub-expand'), bem.is('expanded', expanded)]\">\n <ArrowRight />\n </u-icon>\n </div>\n\n <!-- @vue-ignore -->\n <transition\n @enter=\"(el: Element) => expandTransition.enter(el as HTMLElement)\"\n @after-enter=\"(el: Element) => expandTransition.afterEnter(el as HTMLElement)\"\n @before-leave=\"(el: Element) => expandTransition.beforeLeave(el as HTMLElement)\"\n @leave=\"(el: Element) => expandTransition.leave(el as HTMLElement)\"\n @after-leave=\"(el: Element) => expandTransition.afterLeave(el as HTMLElement)\"\n >\n <ul :class=\"[cls.e('sub-list'), bem.is('has-active', branchActive)]\" v-show=\"expanded\">\n <template v-for=\"(child, index) of item.children!\" :key=\"getKey(index, parentKey)\">\n <UNavItem v-if=\"!child.children?.length\" :item=\"child\" :depth=\"depth + 1\" />\n <NavSub v-else :item=\"child\" :parent-key=\"getKey(index, parentKey)\" :depth=\"depth + 1\" />\n </template>\n </ul>\n </transition>\n </li>\n</template>\n\n<script setup lang=\"ts\">\nimport { ArrowRight } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed, inject } from 'vue'\n\nimport type { NavItem } from '../../types'\nimport { UIcon } from '../icon'\nimport { NavDIKey } from './di'\nimport { getKey } from './helper'\nimport UNavIcon from './nav-icon.vue'\nimport UNavItem from './nav-item.vue'\n\ndefineOptions({ name: 'UNavSub' })\n\nconst props = defineProps<{ item: NavItem; parentKey: string; depth: number }>()\n\nconst { cls, expandedPath, navProps, expandTransition } = inject(NavDIKey)!\n\nconst expanded = computed(() => expandedPath.has(props.item.path))\n\nconst branchActive = computed(() => {\n const currentPath = navProps.currentPath\n if (!currentPath) return false\n\n const check = (items?: NavItem[]) => {\n return items?.some((item) => item.path === currentPath || check(item.children)) ?? false\n }\n\n return check(props.item.children)\n})\n\nfunction handleToggleExpand() {\n const { item } = props\n expandedPath.has(item.path) ? expandedPath.delete(item.path) : expandedPath.add(item.path)\n}\n</script>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nav.js","names":[],"sources":["../../../src/components/nav/nav.vue"],"sourcesContent":["<template>\n <u-scroll tag=\"ul\" :class=\"[navCls.b, navCls.m(size)]\" :container-class=\"navCls.e('container')\">\n <!-- 常规 -->\n <template v-if=\"!collapsed\">\n <template v-for=\"(item, index) of menus\" :key=\"index\">\n <UNavSub v-if=\"item.children?.length\" :item=\"item\" :parent-key=\"String(index)\" :depth=\"0\" />\n <UNavItem v-else :item=\"item\" :key=\"index\" :depth=\"0\" />\n </template>\n </template>\n\n <!-- 折叠 -->\n <template v-else>\n <template v-for=\"(item, index) of menus\" :key=\"index\">\n <UNavSubCollapsed\n v-if=\"item.children?.length\"\n :item=\"item\"\n :parent-key=\"String(index)\"\n :depth=\"0\"\n />\n <UNavItemCollapsed v-else :item=\"item\" :key=\"index\" :depth=\"0\" />\n </template>\n </template>\n </u-scroll>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { bem, ExpandTransition } from '@veltra/utils'\nimport type { ComponentSize } from '@veltra/utils'\nimport { computed, provide, shallowReactive, watch } from 'vue'\n\nimport type { NavEmits, NavProps } from '../../types/nav'\nimport { UScroll } from '../scroll'\nimport { NavDIKey } from './di'\nimport { collectNavBranchPaths } from './helper'\nimport UNavItemCollapsed from './nav-item-collapsed.vue'\nimport UNavItem from './nav-item.vue'\nimport UNavSubCollapsed from './nav-sub-collapsed.vue'\nimport UNavSub from './nav-sub.vue'\nimport { walkNavWithPath } from './walk-nav-path'\n\ndefineOptions({ name: 'UNav' })\n\nconst props = withDefaults(defineProps<NavProps>(), { collapsed: false })\n\nconst emit = defineEmits<NavEmits>()\n\nconst cls = bem('nav')\nconst collapsedCls = bem('collapsed-nav')\n\nconst navCls = computed(() => {\n return props.collapsed ? collapsedCls : cls\n})\n\nconst expandTransition = new ExpandTransition({\n enterTransition:\n 'height 0.25s cubic-bezier(0.4, 0, 0.2, 1), padding-top 0.25s cubic-bezier(0.4, 0, 0.2, 1), padding-bottom 0.25s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.18s cubic-bezier(0.4, 0, 0.2, 1)',\n leaveTransition:\n 'height 0.2s cubic-bezier(0.4, 0, 1, 1), padding-top 0.2s cubic-bezier(0.4, 0, 1, 1), padding-bottom 0.2s cubic-bezier(0.4, 0, 1, 1), opacity 0.12s cubic-bezier(0.4, 0, 1, 1)',\n opacity: true\n})\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst expandedPath = shallowReactive(new Set<string>())\n\nwatch(\n [() => props.currentPath, () => props.menus],\n ([currentPath, menus]) => {\n if (!currentPath || !menus) return\n menus.forEach((menu) => {\n walkNavWithPath(menu, (node, nodePath) => {\n if (node.path === currentPath) {\n nodePath.slice(0, -1).forEach((path) => {\n expandedPath.add(path.path)\n })\n return false\n }\n })\n })\n },\n { immediate: true }\n)\n\nprovide(NavDIKey, {\n cls,\n collapsedCls,\n navProps: props,\n navEmit: emit,\n expandedPath,\n size,\n expandTransition\n})\n\nfunction expandAll() {\n collectNavBranchPaths(props.menus).forEach((path) => {\n expandedPath.add(path)\n })\n}\n\nfunction collapseAll() {\n expandedPath.clear()\n}\n\ndefineExpose({ expandAll, collapseAll })\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;EA2CA,MAAM,QAAQ;EAEd,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,KAAK;EACrB,MAAM,eAAe,IAAI,eAAe;EAExC,MAAM,SAAS,eAAe;GAC5B,OAAO,MAAM,YAAY,eAAe;EAC1C,CAAC;EAED,MAAM,mBAAmB,IAAI,iBAAiB;GAC5C,iBACE;GACF,iBACE;GACF,SAAS;EACX,CAAC;EAED,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,eAAe,gCAAgB,IAAI,IAAY,CAAC;EAEtD,MACE,OAAO,MAAM,mBAAmB,MAAM,KAAK,IAC1C,CAAC,aAAa,WAAW;GACxB,IAAI,CAAC,eAAe,CAAC,OAAO;GAC5B,MAAM,SAAS,SAAS;IACtB,gBAAgB,OAAO,MAAM,aAAa;KACxC,IAAI,KAAK,SAAS,aAAa;MAC7B,SAAS,MAAM,GAAG,EAAE,CAAC,CAAC,SAAS,SAAS;OACtC,aAAa,IAAI,KAAK,IAAI;MAC5B,CAAC;MACD,OAAO;KACT;IACF,CAAC;GACH,CAAC;EACH,GACA,EAAE,WAAW,KAAK,CACpB;EAEA,QAAQ,UAAU;GAChB;GACA;GACA,UAAU;GACV,SAAS;GACT;GACA;GACA;EACF,CAAC;EAED,SAAS,YAAY;GACnB,sBAAsB,MAAM,KAAK,CAAC,CAAC,SAAS,SAAS;IACnD,aAAa,IAAI,IAAI;GACvB,CAAC;EACH;EAEA,SAAS,cAAc;GACrB,aAAa,MAAM;EACrB;EAEA,SAAa;GAAE;GAAW;EAAY,CAAC;;GAvGrC,
|
|
1
|
+
{"version":3,"file":"nav.js","names":["_openBlock","_createBlock","_unref","UScroll","_normalizeClass","_withCtx","_createCommentVNode","_createElementBlock","_Fragment","_renderList","UNavSub","UNavItem","UNavSubCollapsed","UNavItemCollapsed"],"sources":["../../../src/components/nav/nav.vue"],"sourcesContent":["<template>\n <u-scroll tag=\"ul\" :class=\"[navCls.b, navCls.m(size)]\" :container-class=\"navCls.e('container')\">\n <!-- 常规 -->\n <template v-if=\"!collapsed\">\n <template v-for=\"(item, index) of menus\" :key=\"index\">\n <UNavSub v-if=\"item.children?.length\" :item=\"item\" :parent-key=\"String(index)\" :depth=\"0\" />\n <UNavItem v-else :item=\"item\" :key=\"index\" :depth=\"0\" />\n </template>\n </template>\n\n <!-- 折叠 -->\n <template v-else>\n <template v-for=\"(item, index) of menus\" :key=\"index\">\n <UNavSubCollapsed\n v-if=\"item.children?.length\"\n :item=\"item\"\n :parent-key=\"String(index)\"\n :depth=\"0\"\n />\n <UNavItemCollapsed v-else :item=\"item\" :key=\"index\" :depth=\"0\" />\n </template>\n </template>\n </u-scroll>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport { bem, ExpandTransition } from '@veltra/utils'\nimport type { ComponentSize } from '@veltra/utils'\nimport { computed, provide, shallowReactive, watch } from 'vue'\n\nimport type { NavEmits, NavProps } from '../../types/nav'\nimport { UScroll } from '../scroll'\nimport { NavDIKey } from './di'\nimport { collectNavBranchPaths } from './helper'\nimport UNavItemCollapsed from './nav-item-collapsed.vue'\nimport UNavItem from './nav-item.vue'\nimport UNavSubCollapsed from './nav-sub-collapsed.vue'\nimport UNavSub from './nav-sub.vue'\nimport { walkNavWithPath } from './walk-nav-path'\n\ndefineOptions({ name: 'UNav' })\n\nconst props = withDefaults(defineProps<NavProps>(), { collapsed: false })\n\nconst emit = defineEmits<NavEmits>()\n\nconst cls = bem('nav')\nconst collapsedCls = bem('collapsed-nav')\n\nconst navCls = computed(() => {\n return props.collapsed ? collapsedCls : cls\n})\n\nconst expandTransition = new ExpandTransition({\n enterTransition:\n 'height 0.25s cubic-bezier(0.4, 0, 0.2, 1), padding-top 0.25s cubic-bezier(0.4, 0, 0.2, 1), padding-bottom 0.25s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.18s cubic-bezier(0.4, 0, 0.2, 1)',\n leaveTransition:\n 'height 0.2s cubic-bezier(0.4, 0, 1, 1), padding-top 0.2s cubic-bezier(0.4, 0, 1, 1), padding-bottom 0.2s cubic-bezier(0.4, 0, 1, 1), opacity 0.12s cubic-bezier(0.4, 0, 1, 1)',\n opacity: true\n})\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst expandedPath = shallowReactive(new Set<string>())\n\nwatch(\n [() => props.currentPath, () => props.menus],\n ([currentPath, menus]) => {\n if (!currentPath || !menus) return\n menus.forEach((menu) => {\n walkNavWithPath(menu, (node, nodePath) => {\n if (node.path === currentPath) {\n nodePath.slice(0, -1).forEach((path) => {\n expandedPath.add(path.path)\n })\n return false\n }\n })\n })\n },\n { immediate: true }\n)\n\nprovide(NavDIKey, {\n cls,\n collapsedCls,\n navProps: props,\n navEmit: emit,\n expandedPath,\n size,\n expandTransition\n})\n\nfunction expandAll() {\n collectNavBranchPaths(props.menus).forEach((path) => {\n expandedPath.add(path)\n })\n}\n\nfunction collapseAll() {\n expandedPath.clear()\n}\n\ndefineExpose({ expandAll, collapseAll })\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;EA2CA,MAAM,QAAQ;EAEd,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,KAAK;EACrB,MAAM,eAAe,IAAI,eAAe;EAExC,MAAM,SAAS,eAAe;GAC5B,OAAO,MAAM,YAAY,eAAe;EAC1C,CAAC;EAED,MAAM,mBAAmB,IAAI,iBAAiB;GAC5C,iBACE;GACF,iBACE;GACF,SAAS;EACX,CAAC;EAED,MAAM,EAAE,SAAS,iBAAiB,CAAC,KAAK,GAAG,EAAE,MAAM,UAA2B,CAAC;EAE/E,MAAM,eAAe,gCAAgB,IAAI,IAAY,CAAC;EAEtD,MACE,OAAO,MAAM,mBAAmB,MAAM,KAAK,IAC1C,CAAC,aAAa,WAAW;GACxB,IAAI,CAAC,eAAe,CAAC,OAAO;GAC5B,MAAM,SAAS,SAAS;IACtB,gBAAgB,OAAO,MAAM,aAAa;KACxC,IAAI,KAAK,SAAS,aAAa;MAC7B,SAAS,MAAM,GAAG,EAAE,CAAC,CAAC,SAAS,SAAS;OACtC,aAAa,IAAI,KAAK,IAAI;MAC5B,CAAC;MACD,OAAO;KACT;IACF,CAAC;GACH,CAAC;EACH,GACA,EAAE,WAAW,KAAK,CACpB;EAEA,QAAQ,UAAU;GAChB;GACA;GACA,UAAU;GACV,SAAS;GACT;GACA;GACA;EACF,CAAC;EAED,SAAS,YAAY;GACnB,sBAAsB,MAAM,KAAK,CAAC,CAAC,SAAS,SAAS;IACnD,aAAa,IAAI,IAAI;GACvB,CAAC;EACH;EAEA,SAAS,cAAc;GACrB,aAAa,MAAM;EACrB;EAEA,SAAa;GAAE;GAAW;EAAY,CAAC;;GAvGrC,OAAAA,UAAA,GAAAC,YAqBWC,MAAAC,WAAA,GAAA;IArBD,KAAI;IAAM,OAAKC,eAAA,CAAG,OAAA,MAAO,GAAG,OAAA,MAAO,EAAEF,MAAA,IAAA,CAAI,CAAA,CAAA;IAAK,mBAAiB,OAAA,MAAO,EAAC,WAAA;;IAC/E,SAAAG,cAAW,CAAXC,mBAAA,MAAA,GACiB,CAAA,QAAA,aACfN,UAAA,IAAA,GAAAO,mBAGWC,UAAA,EAAA,KAAA,EAAA,GAAAC,WAHuB,QAAA,QAAhB,MAAM,UAAK;KAAkB,OAAAT,UAAA,GAAAO,mBAAAC,UAAA,EAAA,KAAA,MAAK,GAAA,CACnC,KAAK,UAAU,UAA9BR,UAAA,GAAAC,YAA4FS,aAAA;;MAA/C;MAAO,cAAY,OAAO,KAAK;MAAI,OAAO;KACvF,GAAA,MAAA,GAAA,CAAA,QAAA,YAAA,CAAA,MAAAV,UAAA,GAAAC,YAAwDU,aAAA;MAAhC;MAAO,KAAK;MAAQ,OAAO;;IAKvD,CAAA,GAAA,GAAA,MAAAX,UAAA,GAAAO,mBAUWC,UAAA,EAAA,KAAA,EAAA,GAAA,CAXXF,mBAAA,MAAA,IAEEN,UAAA,IAAA,GAAAO,mBAQWC,UAAA,MAAAC,WARuB,QAAA,QAAhB,MAAM,UAAK;KAAkB,OAAAT,UAAA,GAAAO,mBAAAC,UAAA,EAAA,KAAA,MAAK,GAAA,CAE1C,KAAK,UAAU,UADvBR,UAAA,GAAAC,YAKEW,aAAA;;MAHO;MACN,cAAY,OAAO,KAAK;MACxB,OAAO;KAEV,GAAA,MAAA,GAAA,CAAA,QAAA,YAAA,CAAA,MAAAZ,UAAA,GAAAC,YAAiEY,aAAA;MAAhC;MAAO,KAAK;MAAQ,OAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notification-box.js","names":[],"sources":["../../../src/components/notification/notification-box.vue"],"sourcesContent":["<template>\n <div\n :class=\"[cls.e('stack'), cls.em('stack', position)]\"\n :style=\"stackStyle\"\n @mouseenter=\"hovering = true\"\n @mouseleave=\"hovering = false\"\n >\n <transition-group :name=\"`notification-${vertical}`\" appear @after-leave=\"handleAfterLeave\">\n <div\n v-for=\"(item, index) of notifications\"\n :key=\"item.key\"\n :ref=\"(el) => observeItem(el, item.key)\"\n :data-key=\"item.key\"\n :class=\"cls.e('item')\"\n >\n <UNotification\n v-bind=\"toCardProps(item)\"\n :style=\"cardStyle(index)\"\n @close=\"handleClose(item.key, item.onClose)\"\n @action=\"handleAction(item.key, item.onClick, item.onClose, $event)\"\n />\n </div>\n </transition-group>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem } from '@veltra/utils'\nimport { computed, onBeforeUnmount, reactive, ref, type CSSProperties } from 'vue'\n\nimport type { NotificationOptions, NotificationPosition, NotificationProps } from '../../types'\nimport UNotification from './notification.vue'\n\ndefineOptions({ name: 'UNotificationBox' })\n\n/** 通知项数据结构 */\ntype NotificationItem = NotificationOptions & { key: string }\n\nconst props = defineProps<{ notifications: NotificationItem[]; position: NotificationPosition }>()\n\nconst emit = defineEmits<{ (e: 'closed', key: string): void; (e: 'close', key: string): void }>()\n\nconst cls = bem('notification')\n\n/** 展开态卡片间距 */\nconst GAP = 10\n/** 折叠态每层露出的高度 */\nconst PEEK = 14\n/** 折叠态最多露出的卡片数 */\nconst MAX_VISIBLE = 3\n\nconst hovering = ref(false)\n\n/** 各卡片实测高度, 驱动展开态位移与容器高度 */\nconst heights = reactive<Record<string, number>>({})\n\nconst vertical = computed(() => (props.position.startsWith('top') ? 'top' : 'bottom'))\n\n/** 底部锚定向上堆叠(负向偏移), 顶部锚定向下堆叠 */\nconst direction = computed(() => (vertical.value === 'bottom' ? -1 : 1))\n\nconst observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const el = entry.target as HTMLElement\n const key = el.dataset.key\n if (key) heights[key] = el.offsetHeight\n }\n})\n\nfunction observeItem(el: Element | null, key: string) {\n if (el) observer.observe(el)\n}\n\nonBeforeUnmount(() => observer.disconnect())\n\n/** 数组末尾为最新通知, 位于堆叠最前 */\nfunction cardStyle(index: number): CSSProperties {\n const items = props.notifications\n const stackIndex = items.length - 1 - index\n\n if (hovering.value) {\n // 展开态: 按前方卡片累计高度偏移\n let offset = 0\n for (let i = index + 1; i < items.length; i++) {\n offset += (heights[items[i]!.key] ?? 0) + GAP\n }\n return {\n transform: `translateY(${direction.value * offset}px) scale(1)`,\n opacity: 1,\n pointerEvents: 'auto'\n }\n }\n\n const clamped = Math.min(stackIndex, MAX_VISIBLE - 1)\n return {\n transform: `translateY(${direction.value * clamped * PEEK}px) scale(${1 - clamped * 0.05})`,\n opacity: stackIndex >= MAX_VISIBLE ? 0 : 1,\n pointerEvents: stackIndex === 0 ? 'auto' : 'none'\n }\n}\n\nconst stackStyle = computed<CSSProperties>(() => {\n const items = props.notifications\n if (!items.length) return { height: '0px' }\n\n if (hovering.value) {\n const total = items.reduce((sum, item) => sum + (heights[item.key] ?? 0), 0)\n return { height: `${total + (items.length - 1) * GAP}px` }\n }\n\n const frontHeight = heights[items[items.length - 1]!.key] ?? 0\n const behind = Math.min(items.length - 1, MAX_VISIBLE - 1)\n return { height: `${frontHeight + behind * PEEK}px` }\n})\n\nfunction toCardProps(item: NotificationItem): NotificationProps {\n return {\n title: item.title,\n message: item.message,\n type: item.type,\n closable: item.closable,\n duration: item.duration,\n icon: item.icon,\n buttonText: item.buttonText,\n size: item.size\n }\n}\n\nfunction handleAfterLeave(el: Element) {\n const key = (el as HTMLElement).dataset.key as string\n observer.unobserve(el as HTMLElement)\n delete heights[key]\n emit('closed', key)\n}\n\nfunction handleClose(key: string, onClose?: () => void) {\n emit('close', key)\n onClose?.()\n}\n\nfunction handleAction(\n key: string,\n onClick: NotificationItem['onClick'],\n onClose: NotificationItem['onClose'],\n e: MouseEvent\n) {\n onClick?.(e)\n handleClose(key, onClose)\n}\n</script>\n"],"mappings":";;;;;AA6CA,MAAM,MAAM;;AAEZ,MAAM,OAAO;;AAEb,MAAM,cAAc;;;;;;;;;;;EAXpB,MAAM,QAAQ;EAEd,MAAM,OAAO;EAEb,MAAM,MAAM,IAAI,cAAc;;EAS9B,MAAM,WAAW,IAAI,KAAK;;EAG1B,MAAM,UAAU,SAAiC,CAAC,CAAC;EAEnD,MAAM,WAAW,eAAgB,MAAM,SAAS,WAAW,KAAK,IAAI,QAAQ,QAAS;;EAGrF,MAAM,YAAY,eAAgB,SAAS,UAAU,WAAW,KAAK,CAAE;EAEvE,MAAM,WAAW,IAAI,gBAAgB,YAAY;GAC/C,KAAK,MAAM,SAAS,SAAS;IAC3B,MAAM,KAAK,MAAM;IACjB,MAAM,MAAM,GAAG,QAAQ;IACvB,IAAI,KAAK,QAAQ,OAAO,GAAG;GAC7B;EACF,CAAC;EAED,SAAS,YAAY,IAAoB,KAAa;GACpD,IAAI,IAAI,SAAS,QAAQ,EAAE;EAC7B;EAEA,sBAAsB,SAAS,WAAW,CAAC;;EAG3C,SAAS,UAAU,OAA8B;GAC/C,MAAM,QAAQ,MAAM;GACpB,MAAM,aAAa,MAAM,SAAS,IAAI;GAEtC,IAAI,SAAS,OAAO;IAElB,IAAI,SAAS;IACb,KAAK,IAAI,IAAI,QAAQ,GAAG,IAAI,MAAM,QAAQ,KACxC,WAAW,QAAQ,MAAM,EAAE,CAAE,QAAQ,KAAK;IAE5C,OAAO;KACL,WAAW,cAAc,UAAU,QAAQ,OAAO;KAClD,SAAS;KACT,eAAe;IACjB;GACF;GAEA,MAAM,UAAU,KAAK,IAAI,YAAY,CAAe;GACpD,OAAO;IACL,WAAW,cAAc,UAAU,QAAQ,UAAU,KAAK,YAAY,IAAI,UAAU,IAAK;IACzF,SAAS,cAAc,cAAc,IAAI;IACzC,eAAe,eAAe,IAAI,SAAS;GAC7C;EACF;EAEA,MAAM,aAAa,eAA8B;GAC/C,MAAM,QAAQ,MAAM;GACpB,IAAI,CAAC,MAAM,QAAQ,OAAO,EAAE,QAAQ,MAAM;GAE1C,IAAI,SAAS,OAEX,OAAO,EAAE,QAAQ,GADH,MAAM,QAAQ,KAAK,SAAS,OAAO,QAAQ,KAAK,QAAQ,IAAI,CACtD,KAAS,MAAM,SAAS,KAAK,IAAI,IAAI;GAK3D,OAAO,EAAE,QAAQ,IAFG,QAAQ,MAAM,MAAM,SAAS,EAAE,CAAE,QAAQ,KAC9C,KAAK,IAAI,MAAM,SAAS,GAAG,CACR,IAAS,KAAK,IAAI;EACtD,CAAC;EAED,SAAS,YAAY,MAA2C;GAC9D,OAAO;IACL,OAAO,KAAK;IACZ,SAAS,KAAK;IACd,MAAM,KAAK;IACX,UAAU,KAAK;IACf,UAAU,KAAK;IACf,MAAM,KAAK;IACX,YAAY,KAAK;IACjB,MAAM,KAAK;GACb;EACF;EAEA,SAAS,iBAAiB,IAAa;GACrC,MAAM,MAAO,GAAmB,QAAQ;GACxC,SAAS,UAAU,EAAiB;GACpC,OAAO,QAAQ;GACf,KAAK,UAAU,GAAG;EACpB;EAEA,SAAS,YAAY,KAAa,SAAsB;GACtD,KAAK,SAAS,GAAG;GACjB,UAAU;EACZ;EAEA,SAAS,aACP,KACA,SACA,SACA,GACA;GACA,UAAU,CAAC;GACX,YAAY,KAAK,OAAO;EAC1B;;GAnJE,
|
|
1
|
+
{"version":3,"file":"notification-box.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_normalizeStyle","_createVNode","_TransitionGroup","_withCtx","_Fragment","_renderList","UNotification","_mergeProps"],"sources":["../../../src/components/notification/notification-box.vue"],"sourcesContent":["<template>\n <div\n :class=\"[cls.e('stack'), cls.em('stack', position)]\"\n :style=\"stackStyle\"\n @mouseenter=\"hovering = true\"\n @mouseleave=\"hovering = false\"\n >\n <transition-group :name=\"`notification-${vertical}`\" appear @after-leave=\"handleAfterLeave\">\n <div\n v-for=\"(item, index) of notifications\"\n :key=\"item.key\"\n :ref=\"(el) => observeItem(el, item.key)\"\n :data-key=\"item.key\"\n :class=\"cls.e('item')\"\n >\n <UNotification\n v-bind=\"toCardProps(item)\"\n :style=\"cardStyle(index)\"\n @close=\"handleClose(item.key, item.onClose)\"\n @action=\"handleAction(item.key, item.onClick, item.onClose, $event)\"\n />\n </div>\n </transition-group>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { bem } from '@veltra/utils'\nimport { computed, onBeforeUnmount, reactive, ref, type CSSProperties } from 'vue'\n\nimport type { NotificationOptions, NotificationPosition, NotificationProps } from '../../types'\nimport UNotification from './notification.vue'\n\ndefineOptions({ name: 'UNotificationBox' })\n\n/** 通知项数据结构 */\ntype NotificationItem = NotificationOptions & { key: string }\n\nconst props = defineProps<{ notifications: NotificationItem[]; position: NotificationPosition }>()\n\nconst emit = defineEmits<{ (e: 'closed', key: string): void; (e: 'close', key: string): void }>()\n\nconst cls = bem('notification')\n\n/** 展开态卡片间距 */\nconst GAP = 10\n/** 折叠态每层露出的高度 */\nconst PEEK = 14\n/** 折叠态最多露出的卡片数 */\nconst MAX_VISIBLE = 3\n\nconst hovering = ref(false)\n\n/** 各卡片实测高度, 驱动展开态位移与容器高度 */\nconst heights = reactive<Record<string, number>>({})\n\nconst vertical = computed(() => (props.position.startsWith('top') ? 'top' : 'bottom'))\n\n/** 底部锚定向上堆叠(负向偏移), 顶部锚定向下堆叠 */\nconst direction = computed(() => (vertical.value === 'bottom' ? -1 : 1))\n\nconst observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const el = entry.target as HTMLElement\n const key = el.dataset.key\n if (key) heights[key] = el.offsetHeight\n }\n})\n\nfunction observeItem(el: Element | null, key: string) {\n if (el) observer.observe(el)\n}\n\nonBeforeUnmount(() => observer.disconnect())\n\n/** 数组末尾为最新通知, 位于堆叠最前 */\nfunction cardStyle(index: number): CSSProperties {\n const items = props.notifications\n const stackIndex = items.length - 1 - index\n\n if (hovering.value) {\n // 展开态: 按前方卡片累计高度偏移\n let offset = 0\n for (let i = index + 1; i < items.length; i++) {\n offset += (heights[items[i]!.key] ?? 0) + GAP\n }\n return {\n transform: `translateY(${direction.value * offset}px) scale(1)`,\n opacity: 1,\n pointerEvents: 'auto'\n }\n }\n\n const clamped = Math.min(stackIndex, MAX_VISIBLE - 1)\n return {\n transform: `translateY(${direction.value * clamped * PEEK}px) scale(${1 - clamped * 0.05})`,\n opacity: stackIndex >= MAX_VISIBLE ? 0 : 1,\n pointerEvents: stackIndex === 0 ? 'auto' : 'none'\n }\n}\n\nconst stackStyle = computed<CSSProperties>(() => {\n const items = props.notifications\n if (!items.length) return { height: '0px' }\n\n if (hovering.value) {\n const total = items.reduce((sum, item) => sum + (heights[item.key] ?? 0), 0)\n return { height: `${total + (items.length - 1) * GAP}px` }\n }\n\n const frontHeight = heights[items[items.length - 1]!.key] ?? 0\n const behind = Math.min(items.length - 1, MAX_VISIBLE - 1)\n return { height: `${frontHeight + behind * PEEK}px` }\n})\n\nfunction toCardProps(item: NotificationItem): NotificationProps {\n return {\n title: item.title,\n message: item.message,\n type: item.type,\n closable: item.closable,\n duration: item.duration,\n icon: item.icon,\n buttonText: item.buttonText,\n size: item.size\n }\n}\n\nfunction handleAfterLeave(el: Element) {\n const key = (el as HTMLElement).dataset.key as string\n observer.unobserve(el as HTMLElement)\n delete heights[key]\n emit('closed', key)\n}\n\nfunction handleClose(key: string, onClose?: () => void) {\n emit('close', key)\n onClose?.()\n}\n\nfunction handleAction(\n key: string,\n onClick: NotificationItem['onClick'],\n onClose: NotificationItem['onClose'],\n e: MouseEvent\n) {\n onClick?.(e)\n handleClose(key, onClose)\n}\n</script>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notification.js","names":[],"sources":["../../../src/components/notification/notification.vue"],"sourcesContent":["<template>\n <div\n :class=\"[cls.b, cls.m(size), cls.e(type)]\"\n @mouseenter=\"suspendTimer\"\n @mouseleave=\"startTimer\"\n >\n <div :class=\"cls.e('icon')\">\n <UIcon>\n <component :is=\"typeIcon\" />\n </UIcon>\n </div>\n <div :class=\"cls.e('content')\">\n <div :class=\"cls.em('content', 'title')\" v-if=\"title\">{{ title }}</div>\n <div :class=\"cls.em('content', 'message')\" v-if=\"message\">{{ message }}</div>\n <div :class=\"cls.em('content', 'button')\" v-if=\"buttonText\">\n <UButton :type=\"type\" plain @click=\"(e) => emit('action', e)\">{{ buttonText }}</UButton>\n </div>\n </div>\n <div :class=\"cls.e('close')\" v-if=\"closable || duration === 0\" @click.stop=\"emit('close')\">\n <UIcon><Close /></UIcon>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport {\n CircleCheckFilled,\n CircleClose,\n Close,\n InfoFilled,\n QuestionFilled,\n WarningFilled\n} from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed, onBeforeUnmount, onMounted } from 'vue'\n\nimport type { NotificationEmits, NotificationProps, ColorType } from '../../types'\nimport { UButton } from '../button'\nimport { UIcon } from '../icon'\n\ndefineOptions({ name: 'UNotification' })\n\nconst props = withDefaults(defineProps<NotificationProps>(), {\n closable: false,\n duration: 4500,\n buttonText: ''\n})\n\nconst emit = defineEmits<NotificationEmits>()\n\nconst { type, size } = useFallbackProps([props], { type: 'primary' as ColorType, size: 'default' })\n\nconst typeIcon = computed(() => {\n return (\n props.icon ||\n {\n primary: InfoFilled,\n info: QuestionFilled,\n success: CircleCheckFilled,\n warning: WarningFilled,\n danger: CircleClose\n }[type.value]\n )\n})\n\nconst cls = bem('notification')\n\n/** 剩余时长制的自动关闭计时器, 悬停暂停 */\nlet startTime = 0\nlet timer = 0\nlet restDuration = 0\n\nfunction startTimer() {\n if (!props.duration) return\n startTime = Date.now()\n timer = setTimeout(() => emit('close'), restDuration)\n}\n\nfunction suspendTimer() {\n if (!props.duration) return\n clearTimeout(timer)\n restDuration -= Date.now() - startTime\n}\n\nonMounted(() => {\n restDuration = props.duration\n startTimer()\n})\n\nonBeforeUnmount(() => clearTimeout(timer))\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;EA2CA,MAAM,QAAQ;EAMd,MAAM,OAAO;EAEb,MAAM,EAAE,MAAM,SAAS,iBAAiB,CAAC,KAAK,GAAG;GAAE,MAAM;GAAwB,MAAM;EAAU,CAAC;EAElG,MAAM,WAAW,eAAe;GAC9B,OACE,MAAM,QACN;IACE,SAAS;IACT,MAAM;IACN,SAAS;IACT,SAAS;IACT,QAAQ;GACV,EAAE,KAAK;EAEX,CAAC;EAED,MAAM,MAAM,IAAI,cAAc;;EAG9B,IAAI,YAAY;EAChB,IAAI,QAAQ;EACZ,IAAI,eAAe;EAEnB,SAAS,aAAa;GACpB,IAAI,CAAC,MAAM,UAAU;GACrB,YAAY,KAAK,IAAI;GACrB,QAAQ,iBAAiB,KAAK,OAAO,GAAG,YAAY;EACtD;EAEA,SAAS,eAAe;GACtB,IAAI,CAAC,MAAM,UAAU;GACrB,aAAa,KAAK;GAClB,gBAAgB,KAAK,IAAI,IAAI;EAC/B;EAEA,gBAAgB;GACd,eAAe,MAAM;GACrB,WAAW;EACb,CAAC;EAED,sBAAsB,aAAa,KAAK,CAAC;;GAzFvC,
|
|
1
|
+
{"version":3,"file":"notification.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_createVNode","UIcon","_withCtx","_createBlock","_resolveDynamicComponent","_toDisplayString","_createCommentVNode","UButton","_createTextVNode","_withModifiers"],"sources":["../../../src/components/notification/notification.vue"],"sourcesContent":["<template>\n <div\n :class=\"[cls.b, cls.m(size), cls.e(type)]\"\n @mouseenter=\"suspendTimer\"\n @mouseleave=\"startTimer\"\n >\n <div :class=\"cls.e('icon')\">\n <UIcon>\n <component :is=\"typeIcon\" />\n </UIcon>\n </div>\n <div :class=\"cls.e('content')\">\n <div :class=\"cls.em('content', 'title')\" v-if=\"title\">{{ title }}</div>\n <div :class=\"cls.em('content', 'message')\" v-if=\"message\">{{ message }}</div>\n <div :class=\"cls.em('content', 'button')\" v-if=\"buttonText\">\n <UButton :type=\"type\" plain @click=\"(e) => emit('action', e)\">{{ buttonText }}</UButton>\n </div>\n </div>\n <div :class=\"cls.e('close')\" v-if=\"closable || duration === 0\" @click.stop=\"emit('close')\">\n <UIcon><Close /></UIcon>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFallbackProps } from '@veltra/compositions'\nimport {\n CircleCheckFilled,\n CircleClose,\n Close,\n InfoFilled,\n QuestionFilled,\n WarningFilled\n} from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed, onBeforeUnmount, onMounted } from 'vue'\n\nimport type { NotificationEmits, NotificationProps, ColorType } from '../../types'\nimport { UButton } from '../button'\nimport { UIcon } from '../icon'\n\ndefineOptions({ name: 'UNotification' })\n\nconst props = withDefaults(defineProps<NotificationProps>(), {\n closable: false,\n duration: 4500,\n buttonText: ''\n})\n\nconst emit = defineEmits<NotificationEmits>()\n\nconst { type, size } = useFallbackProps([props], { type: 'primary' as ColorType, size: 'default' })\n\nconst typeIcon = computed(() => {\n return (\n props.icon ||\n {\n primary: InfoFilled,\n info: QuestionFilled,\n success: CircleCheckFilled,\n warning: WarningFilled,\n danger: CircleClose\n }[type.value]\n )\n})\n\nconst cls = bem('notification')\n\n/** 剩余时长制的自动关闭计时器, 悬停暂停 */\nlet startTime = 0\nlet timer = 0\nlet restDuration = 0\n\nfunction startTimer() {\n if (!props.duration) return\n startTime = Date.now()\n timer = setTimeout(() => emit('close'), restDuration)\n}\n\nfunction suspendTimer() {\n if (!props.duration) return\n clearTimeout(timer)\n restDuration -= Date.now() - startTime\n}\n\nonMounted(() => {\n restDuration = props.duration\n startTimer()\n})\n\nonBeforeUnmount(() => clearTimeout(timer))\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;EA2CA,MAAM,QAAQ;EAMd,MAAM,OAAO;EAEb,MAAM,EAAE,MAAM,SAAS,iBAAiB,CAAC,KAAK,GAAG;GAAE,MAAM;GAAwB,MAAM;EAAU,CAAC;EAElG,MAAM,WAAW,eAAe;GAC9B,OACE,MAAM,QACN;IACE,SAAS;IACT,MAAM;IACN,SAAS;IACT,SAAS;IACT,QAAQ;GACV,EAAE,KAAK;EAEX,CAAC;EAED,MAAM,MAAM,IAAI,cAAc;;EAG9B,IAAI,YAAY;EAChB,IAAI,QAAQ;EACZ,IAAI,eAAe;EAEnB,SAAS,aAAa;GACpB,IAAI,CAAC,MAAM,UAAU;GACrB,YAAY,KAAK,IAAI;GACrB,QAAQ,iBAAiB,KAAK,OAAO,GAAG,YAAY;EACtD;EAEA,SAAS,eAAe;GACtB,IAAI,CAAC,MAAM,UAAU;GACrB,aAAa,KAAK;GAClB,gBAAgB,KAAK,IAAI,IAAI;EAC/B;EAEA,gBAAgB;GACd,eAAe,MAAM;GACrB,WAAW;EACb,CAAC;EAED,sBAAsB,aAAa,KAAK,CAAC;;GAzFvC,OAAAA,UAAA,GAAAC,mBAoBM,OAAA;IAnBH,OAAKC,eAAA;KAAGC,MAAA,GAAA,CAAG,CAAC;KAAGA,MAAA,GAAA,CAAG,CAAC,EAAEA,MAAA,IAAA,CAAI;KAAGA,MAAA,GAAA,CAAG,CAAC,EAAEA,MAAA,IAAA,CAAI;IAAA,CAAA;IACtC,cAAY;IACZ,cAAY;;IAEbC,mBAIM,OAAA,EAJA,OAAKF,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA,CAAA,EAAA,GAChB,CAAAE,YAEQF,MAAAG,WAAA,GAAA,MAAA;KADN,SAAAC,cAA4B,EAA5BP,UAAA,GAAAQ,YAA4BC,wBAAZ,SAAA,KAAQ,CAAA,EAAA,CAAA;;;IAG5BL,mBAMM,OAAA,EANA,OAAKF,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,SAAA,CAAA,EAAA,GAAA;KAC+B,QAAA,SAA/CH,UAAA,GAAAC,mBAAuE,OAAA;;MAAjE,OAAKC,eAAEC,MAAA,GAAA,CAAG,CAAC,GAAE,WAAA,OAAA,CAAA;KAAsC,GAAAO,gBAAA,QAAA,KAAK,GAAA,CAAA,KAAAC,mBAAA,QAAA,IAAA;KACb,QAAA,WAAjDX,UAAA,GAAAC,mBAA6E,OAAA;;MAAvE,OAAKC,eAAEC,MAAA,GAAA,CAAG,CAAC,GAAE,WAAA,SAAA,CAAA;KAA0C,GAAAO,gBAAA,QAAA,OAAO,GAAA,CAAA,KAAAC,mBAAA,QAAA,IAAA;KACpB,QAAA,cAAhDX,UAAA,GAAAC,mBAEM,OAAA;;MAFA,OAAKC,eAAEC,MAAA,GAAA,CAAG,CAAC,GAAE,WAAA,QAAA,CAAA;KACjB,GAAA,CAAAE,YAAwFF,MAAAS,WAAA,GAAA;MAA9E,MAAMT,MAAA,IAAA;MAAM,OAAA;MAAO,SAAK,OAAA,OAAA,OAAA,MAAG,MAAM,KAAI,UAAW,CAAC;;MAAG,SAAAI,cAAgB,CAAbM,gBAAAH,gBAAA,QAAA,UAAU,GAAA,CAAA,CAAA,CAAA;;;;IAG5C,QAAA,YAAY,QAAA,aAAQ,KAAvDV,UAAA,GAAAC,mBAEM,OAAA;;KAFA,OAAKC,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,OAAA,CAAA;KAA8C,SAAK,OAAA,OAAA,OAAA,KAAAW,eAAA,WAAO,KAAI,OAAA,GAAA,CAAA,MAAA,CAAA;IAC9E,GAAA,CAAAT,YAAwBF,MAAAG,WAAA,GAAA,MAAA;KAAjB,SAAAC,cAAS,CAATF,YAASF,MAAA,KAAA,CAAA,CAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"number.js","names":[],"sources":["../../../src/components/number/number.vue"],"sourcesContent":["<template>\n {{ formatted }}\n</template>\n\n<script lang=\"ts\" setup>\nimport { $n } from '@cat-kit/core'\nimport { Tween } from '@veltra/utils'\nimport { computed, reactive, watch } from 'vue'\n\nimport type { NumberProps } from '../../types'\n\ndefineOptions({ name: 'UNumber' })\n\nconst props = withDefaults(defineProps<NumberProps>(), { duration: 800, format: 'decimal' })\n\nconst number = reactive({ value: 0 })\n\nconst tween = computed(() =>\n props.tween\n ? new Tween(number, { duration: props.duration, easingFunction: Tween.easing.easeInOutQuad })\n : null\n)\n\nconst formatter = computed(() => {\n return $n.formatter({\n currency: props.format === 'currency' ? 'CNY' : undefined,\n style: props.format,\n precision: props.precision,\n maximumFractionDigits: props.maxPrecision,\n minimumFractionDigits: props.minPrecision\n })\n})\n\nconst formatted = computed(() => {\n return formatter.value.format(number.value)\n})\n\nwatch(\n () => props.value,\n () => {\n props.tween ? tween.value.to({ value: props.value }) : (number.value = props.value)\n },\n { immediate: true }\n)\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;EAaA,MAAM,QAAQ;EAEd,MAAM,SAAS,SAAS,EAAE,OAAO,EAAE,CAAC;EAEpC,MAAM,QAAQ,eACZ,MAAM,QACF,IAAI,MAAM,QAAQ;GAAE,UAAU,MAAM;GAAU,gBAAgB,MAAM,OAAO;EAAc,CAAC,IAC1F,IACN;EAEA,MAAM,YAAY,eAAe;GAC/B,OAAO,GAAG,UAAU;IAClB,UAAU,MAAM,WAAW,aAAa,QAAQ,KAAA;IAChD,OAAO,MAAM;IACb,WAAW,MAAM;IACjB,uBAAuB,MAAM;IAC7B,uBAAuB,MAAM;GAC/B,CAAC;EACH,CAAC;EAED,MAAM,YAAY,eAAe;GAC/B,OAAO,UAAU,MAAM,OAAO,OAAO,KAAK;EAC5C,CAAC;EAED,YACQ,MAAM,aACN;GACJ,MAAM,QAAQ,MAAM,MAAM,GAAG,EAAE,OAAO,MAAM,MAAM,CAAC,IAAK,OAAO,QAAQ,MAAM;EAC/E,GACA,EAAE,WAAW,KAAK,CACpB;;GA1CK,
|
|
1
|
+
{"version":3,"file":"number.js","names":["_toDisplayString"],"sources":["../../../src/components/number/number.vue"],"sourcesContent":["<template>\n {{ formatted }}\n</template>\n\n<script lang=\"ts\" setup>\nimport { $n } from '@cat-kit/core'\nimport { Tween } from '@veltra/utils'\nimport { computed, reactive, watch } from 'vue'\n\nimport type { NumberProps } from '../../types'\n\ndefineOptions({ name: 'UNumber' })\n\nconst props = withDefaults(defineProps<NumberProps>(), { duration: 800, format: 'decimal' })\n\nconst number = reactive({ value: 0 })\n\nconst tween = computed(() =>\n props.tween\n ? new Tween(number, { duration: props.duration, easingFunction: Tween.easing.easeInOutQuad })\n : null\n)\n\nconst formatter = computed(() => {\n return $n.formatter({\n currency: props.format === 'currency' ? 'CNY' : undefined,\n style: props.format,\n precision: props.precision,\n maximumFractionDigits: props.maxPrecision,\n minimumFractionDigits: props.minPrecision\n })\n})\n\nconst formatted = computed(() => {\n return formatter.value.format(number.value)\n})\n\nwatch(\n () => props.value,\n () => {\n props.tween ? tween.value.to({ value: props.value }) : (number.value = props.value)\n },\n { immediate: true }\n)\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;EAaA,MAAM,QAAQ;EAEd,MAAM,SAAS,SAAS,EAAE,OAAO,EAAE,CAAC;EAEpC,MAAM,QAAQ,eACZ,MAAM,QACF,IAAI,MAAM,QAAQ;GAAE,UAAU,MAAM;GAAU,gBAAgB,MAAM,OAAO;EAAc,CAAC,IAC1F,IACN;EAEA,MAAM,YAAY,eAAe;GAC/B,OAAO,GAAG,UAAU;IAClB,UAAU,MAAM,WAAW,aAAa,QAAQ,KAAA;IAChD,OAAO,MAAM;IACb,WAAW,MAAM;IACjB,uBAAuB,MAAM;IAC7B,uBAAuB,MAAM;GAC/B,CAAC;EACH,CAAC;EAED,MAAM,YAAY,eAAe;GAC/B,OAAO,UAAU,MAAM,OAAO,OAAO,KAAK;EAC5C,CAAC;EAED,YACQ,MAAM,aACN;GACJ,MAAM,QAAQ,MAAM,MAAM,GAAG,EAAE,OAAO,MAAM,MAAM,CAAC,IAAK,OAAO,QAAQ,MAAM;EAC/E,GACA,EAAE,WAAW,KAAK,CACpB;;GA1CK,OAAAA,gBAAA,UAAA,KAAS"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"number-input.js","names":[],"sources":["../../../src/components/number-input/number-input.vue"],"sourcesContent":["<template>\n <u-input\n v-if=\"!readonly\"\n ref=\"inputRef\"\n :class=\"className\"\n :model-value=\"displayed\"\n v-bind=\"inputProps\"\n @update:model-value=\"handleUpdateModelValue\"\n @change=\"handleChange\"\n @keydown.stop=\"handleKeydown\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n @mouseenter=\"handleMouseEnter\"\n @mouseleave=\"handleMouseLeave\"\n :size=\"size\"\n :readonly=\"readonly\"\n :disabled=\"disabled\"\n :clearable=\"false\"\n >\n <template #suffix v-if=\"hasSuffix\">\n <span :class=\"cls.e('suffix')\">\n <u-icon\n v-if=\"props.clearable\"\n :class=\"[cls.e('clear'), bem.is('hidden', !showClear)]\"\n :title=\"showClear ? '清除' : undefined\"\n @click.stop=\"handleClear\"\n >\n <Close />\n </u-icon>\n <span v-if=\"hasCustomSuffix\" :class=\"cls.e('suffix-content')\">\n {{ suffix }}\n <slot name=\"suffix\" />\n </span>\n </span>\n\n <div v-if=\"showStep\" :class=\"cls.e('step')\">\n <u-icon\n @click=\"increase\"\n v-ripple=\"!disabled && increasable\"\n :class=\"bem.is('disabled', disabled || !increasable)\"\n >\n <ArrowUp />\n </u-icon>\n <u-icon\n @click=\"decrease\"\n v-ripple=\"!disabled && reducible\"\n :class=\"bem.is('disabled', disabled || !reducible)\"\n >\n <ArrowDown />\n </u-icon>\n </div>\n </template>\n\n <template #prefix v-if=\"slots.prefix\">\n <slot name=\"prefix\" />\n </template>\n </u-input>\n\n <template v-else>\n {{ generateDisplayed || FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { $n, n, o, isUndef } from '@cat-kit/core'\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { vRipple } from '@veltra/directives'\nimport { ArrowDown, ArrowUp, Close } from '@veltra/icons/normal'\nimport { bem, FORM_EMPTY_CONTENT, Tween } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed, shallowRef, useAttrs, watch } from 'vue'\n\nimport type { NumberInputEmits, NumberInputProps, InputExposed } from '../../types'\nimport { UIcon } from '../icon'\nimport { UInput } from '../input'\n\ndefineOptions({ name: 'UNumberInput', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<NumberInputProps>(), {\n placeholder: '请输入',\n clearable: true,\n disabled: undefined,\n readonly: undefined\n})\nconst emit = defineEmits<NumberInputEmits>()\n\nconst slots = defineSlots<{ prefix?: () => any; suffix?: () => any }>()\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\nconst attrs = useAttrs()\n\nconst inputProps = computed(() => ({\n ...attrs,\n ...o(props).pick(['disabled', 'placeholder', 'size', 'prefix'])\n}))\n\nconst inputRef = shallowRef<InputExposed>()\n\nconst inputDom = computed(() => inputRef.value?.el)\n\nconst cls = bem('number-input')\n\nconst className = computed(() => {\n return [cls.b, cls.m(size.value)]\n})\n\n/** 实际值 */\nconst model = defineModel<NumberInputProps['modelValue']>()\n\n// 展示值\nconst displayed = shallowRef('')\n\nconst focused = shallowRef(false)\nconst hovered = shallowRef(false)\n\nconst generateDisplayed = computed(() => {\n if (!displayed.value) return ''\n\n return `${props.prefix ?? ''}${displayed.value}${props.suffix ?? ''}`\n})\n\nconst showStep = computed(() => props.step !== undefined && props.step !== false)\n\nconst hasCustomSuffix = computed(() => !!props.suffix || !!slots.suffix)\n\nconst hasSuffix = computed(() => props.clearable || hasCustomSuffix.value || showStep.value)\n\nconst showClear = computed(() => {\n return props.clearable && !disabled.value && displayed.value !== '' && hovered.value\n})\n\n/** 步长 */\nconst stepVal = computed<number>(() => {\n const { step } = props\n if (step === undefined) return 1\n return typeof step === 'boolean' ? 1 : step\n})\n\n/** 是否可增 */\nconst increasable = computed(() => {\n const { max, multiple } = props\n if (isUndef(max) || isUndef(model.value)) return true\n // 如果存在倍数,先将 model.value 除以倍数得到原始值再比较\n const rawValue = multiple ? $n.div(model.value, multiple) : model.value\n return rawValue < max\n})\n\n/** 是否可减 */\nconst reducible = computed(() => {\n const { min, multiple } = props\n if (isUndef(min) || isUndef(model.value)) return true\n // 如果存在倍数,先将 model.value 除以倍数得到原始值再比较\n const rawValue = multiple ? $n.div(model.value, multiple) : model.value\n return rawValue > min\n})\n\n// 通过值和步长值计算默认的最大精度\nconst defaultMaxPrecision = computed(() => {\n const { multiple } = props\n // 如果存在倍数,基于原始值计算精度\n const rawValue =\n multiple && model.value !== undefined ? $n.div(model.value, multiple) : model.value\n return Math.max(\n String(rawValue).split('.')[1]?.length ?? 0,\n String(stepVal.value).split('.')[1]?.length ?? 0\n )\n})\n\n/**\n * 获取展示值\n * @param num 实际值\n */\nfunction getDisplayed(num?: number): string {\n if (!num && num !== 0) return ''\n\n const {\n currency,\n precision,\n minPrecision,\n // 如果没有指定最大精度那么设置默认为值和步长值中的较大值\n maxPrecision = defaultMaxPrecision.value,\n multiple\n } = props\n\n // 如果存在倍数,先将实际值除以倍数得到原始值\n const displayValue = multiple ? $n.div(num, multiple) : num\n\n return currency\n ? n(displayValue).currency('CNY', { precision, minPrecision, maxPrecision })\n : n(displayValue).fixed(precision ?? { minPrecision, maxPrecision })\n}\n\nwatch(\n [model, focused, () => props.currency],\n ([modelValue, inputFocused]) => {\n if (inputFocused) return\n displayed.value = getDisplayed(modelValue)\n },\n { immediate: true }\n)\n\n/**\n * 解析展示值\n * @param str 展示值\n */\nfunction parseDisplayed(str: string): number | undefined {\n if (!str) return undefined\n\n // 将货币格式去掉再转化为数字\n const number = +str.replace(/,/g, '')\n const { multiple } = props\n\n // 如果解析失败,使用当前值作为回退\n // 如果存在倍数,需要先将 model.value 除以倍数得到原始值\n let result: number | undefined\n if (isNaN(number)) {\n if (model.value === undefined) return undefined\n result = multiple ? $n.div(model.value, multiple) : model.value\n } else {\n result = number\n }\n\n if (result === undefined) return undefined\n\n const { precision, maxPrecision, minPrecision } = props\n\n const fixedResult = +n(result).fixed(precision ?? { minPrecision, maxPrecision })\n\n // 如果存在倍数,将原始值乘以倍数返回实际值\n return multiple ? $n.mul(fixedResult, multiple) : fixedResult\n}\n\n/**\n * 获取有效值\n * @param val 值\n */\nfunction getValidValue<T extends undefined | number>(val: T): T {\n if (val === undefined) return val\n const { min, max, multiple } = props\n\n // 如果存在倍数,先将值除以倍数得到原始值进行验证,验证后再乘以倍数\n if (multiple) {\n const rawVal = $n.div(val, multiple)\n let validRawVal = rawVal\n if (min !== undefined && rawVal < min) validRawVal = min\n if (max !== undefined && rawVal > max) validRawVal = max\n return $n.mul(validRawVal, multiple) as T\n }\n\n if (min !== undefined && val < min) return min as T\n if (max !== undefined && val > max) return max as T\n return val\n}\n\nfunction handleUpdateModelValue(input: string): void {\n const newVal = parseDisplayed(input)\n model.value = getValidValue(newVal)\n displayed.value = input\n}\n\nfunction handleClear(): void {\n if (!showClear.value) return\n model.value = undefined\n displayed.value = ''\n emit('clear')\n}\n\n/**\n * 处理输入值变化的函数, 该函数仅在输入框失去焦点时触发,\n * 主要用于在输入非数字的情况下的修正处理\n * @param input 输入的值\n */\nfunction handleChange() {\n emit('change', model.value)\n}\n\nconst tween = new Tween(\n { n: model.value ?? 0 },\n {\n onUpdate(state) {\n const _rawInput = inputDom.value\n if (!_rawInput) return\n const { multiple } = props\n // 如果存在倍数,tween.state.n 存储的是原始值,需要乘以倍数后传给 getDisplayed\n const actualValue = multiple ? $n.mul(state.n, multiple) : state.n\n _rawInput.value = getDisplayed(actualValue)\n },\n // 动画进行的过程值有可能被改变, 因此在onComplete中确保还原的是原本的值\n onComplete() {\n const _rawInput = inputDom.value\n if (!_rawInput) return\n _rawInput.value = getDisplayed(model.value)\n }\n }\n)\n\n/**\n * 步进后更新输入框的展示值\n * 步长为 1 时直接展示目标值, 不播放数字滚动动画\n * @param rawFrom 步进前的原始值(存在倍数时为除以倍数后的值)\n * @param rawTarget 步进后的原始值(存在倍数时为除以倍数后的值)\n */\nfunction updateStepDisplay(rawFrom: number, rawTarget: number): void {\n tween.state.n = rawFrom\n\n if (stepVal.value === 1) {\n tween.state.n = rawTarget\n const _rawInput = inputDom.value\n if (!_rawInput) return\n const { multiple } = props\n _rawInput.value = getDisplayed(multiple ? $n.mul(rawTarget, multiple) : rawTarget)\n return\n }\n\n // tween 动画在原始值上进行\n tween.to({ n: rawTarget })\n}\n\n/** 增 */\nfunction increase(): void {\n if (disabled.value) return\n const { multiple } = props\n const val = model.value ?? 0\n\n if (multiple) {\n // 如果存在倍数,先将实际值除以倍数得到原始值\n const rawVal = $n.div(val, multiple)\n // 在原始值基础上加步长\n const newRawVal = $n.plus(rawVal, stepVal.value)\n // 乘以倍数得到新的实际值\n const target = getValidValue($n.mul(newRawVal, multiple))\n model.value = target\n updateStepDisplay($n.div(val, multiple), $n.div(target, multiple))\n } else {\n const target = getValidValue($n.plus(val, stepVal.value))\n model.value = target\n updateStepDisplay(val, target)\n }\n}\n\n/** 减 */\nfunction decrease(): void {\n if (disabled.value) return\n const { multiple } = props\n const val = model.value ?? 0\n\n if (multiple) {\n // 如果存在倍数,先将实际值除以倍数得到原始值\n const rawVal = $n.div(val, multiple)\n // 在原始值基础上减步长\n const newRawVal = $n.minus(rawVal, stepVal.value)\n // 乘以倍数得到新的实际值\n const target = getValidValue($n.mul(newRawVal, multiple))\n model.value = target\n updateStepDisplay($n.div(val, multiple), $n.div(target, multiple))\n } else {\n const target = getValidValue($n.minus(val, stepVal.value))\n model.value = target\n updateStepDisplay(val, target)\n }\n}\n\nfunction handleKeydown(e: KeyboardEvent): void {\n if (!props.step) return\n if (e.key === 'ArrowUp') {\n e.preventDefault()\n return increase()\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n return decrease()\n }\n}\n\nfunction handleFocus(): void {\n focused.value = true\n\n // 如果初始值和当前设置的精度不匹配则进行精度修正\n if (model.value === undefined) return\n const { precision, maxPrecision, minPrecision, multiple } = props\n\n if (multiple) {\n // 如果存在倍数,先除以倍数得到原始值进行精度修正,再乘以倍数\n const rawVal = $n.div(model.value, multiple)\n const fixedRawVal = +n(rawVal).fixed(precision ?? { maxPrecision, minPrecision })\n model.value = $n.mul(fixedRawVal, multiple)\n } else {\n model.value = +n(model.value).fixed(precision ?? { maxPrecision, minPrecision })\n }\n}\n\nfunction handleBlur(): void {\n focused.value = false\n model.value = props.modelValue\n}\n\nfunction handleMouseEnter(): void {\n hovered.value = true\n}\n\nfunction handleMouseLeave(): void {\n hovered.value = false\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8EA,MAAM,QAAQ;EAMd,MAAM,OAAO;EAEb,MAAM,QAAQ,SAAA;EAEd,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,QAAQ,SAAS;EAEvB,MAAM,aAAa,gBAAgB;GACjC,GAAG;GACH,GAAG,EAAE,KAAK,CAAC,CAAC,KAAK;IAAC;IAAY;IAAe;IAAQ;GAAQ,CAAC;EAChE,EAAE;EAEF,MAAM,WAAW,WAAyB;EAE1C,MAAM,WAAW,eAAe,SAAS,OAAO,EAAE;EAElD,MAAM,MAAM,IAAI,cAAc;EAE9B,MAAM,YAAY,eAAe;GAC/B,OAAO,CAAC,IAAI,GAAG,IAAI,EAAE,KAAK,KAAK,CAAC;EAClC,CAAC;;EAGD,MAAM,QAAQ,SAA2C,SAAA,YAAC;EAG1D,MAAM,YAAY,WAAW,EAAE;EAE/B,MAAM,UAAU,WAAW,KAAK;EAChC,MAAM,UAAU,WAAW,KAAK;EAEhC,MAAM,oBAAoB,eAAe;GACvC,IAAI,CAAC,UAAU,OAAO,OAAO;GAE7B,OAAO,GAAG,MAAM,UAAU,KAAK,UAAU,QAAQ,MAAM,UAAU;EACnE,CAAC;EAED,MAAM,WAAW,eAAe,MAAM,SAAS,KAAA,KAAa,MAAM,SAAS,KAAK;EAEhF,MAAM,kBAAkB,eAAe,CAAC,CAAC,MAAM,UAAU,CAAC,CAAC,MAAM,MAAM;EAEvE,MAAM,YAAY,eAAe,MAAM,aAAa,gBAAgB,SAAS,SAAS,KAAK;EAE3F,MAAM,YAAY,eAAe;GAC/B,OAAO,MAAM,aAAa,CAAC,SAAS,SAAS,UAAU,UAAU,MAAM,QAAQ;EACjF,CAAC;;EAGD,MAAM,UAAU,eAAuB;GACrC,MAAM,EAAE,SAAS;GACjB,IAAI,SAAS,KAAA,GAAW,OAAO;GAC/B,OAAO,OAAO,SAAS,YAAY,IAAI;EACzC,CAAC;;EAGD,MAAM,cAAc,eAAe;GACjC,MAAM,EAAE,KAAK,aAAa;GAC1B,IAAI,QAAQ,GAAG,KAAK,QAAQ,MAAM,KAAK,GAAG,OAAO;GAGjD,QADiB,WAAW,GAAG,IAAI,MAAM,OAAO,QAAQ,IAAI,MAAM,SAChD;EACpB,CAAC;;EAGD,MAAM,YAAY,eAAe;GAC/B,MAAM,EAAE,KAAK,aAAa;GAC1B,IAAI,QAAQ,GAAG,KAAK,QAAQ,MAAM,KAAK,GAAG,OAAO;GAGjD,QADiB,WAAW,GAAG,IAAI,MAAM,OAAO,QAAQ,IAAI,MAAM,SAChD;EACpB,CAAC;EAGD,MAAM,sBAAsB,eAAe;GACzC,MAAM,EAAE,aAAa;GAErB,MAAM,WACJ,YAAY,MAAM,UAAU,KAAA,IAAY,GAAG,IAAI,MAAM,OAAO,QAAQ,IAAI,MAAM;GAChF,OAAO,KAAK,IACV,OAAO,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,UAAU,GAC1C,OAAO,QAAQ,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,UAAU,CACjD;EACF,CAAC;;;;;EAMD,SAAS,aAAa,KAAsB;GAC1C,IAAI,CAAC,OAAO,QAAQ,GAAG,OAAO;GAE9B,MAAM,EACJ,UACA,WACA,cAEA,eAAe,oBAAoB,OACnC,aACE;GAGJ,MAAM,eAAe,WAAW,GAAG,IAAI,KAAK,QAAQ,IAAI;GAExD,OAAO,WACH,EAAE,YAAY,CAAC,CAAC,SAAS,OAAO;IAAE;IAAW;IAAc;GAAa,CAAC,IACzE,EAAE,YAAY,CAAC,CAAC,MAAM,aAAa;IAAE;IAAc;GAAa,CAAC;EACvE;EAEA,MACE;GAAC;GAAO;SAAe,MAAM;EAAQ,IACpC,CAAC,YAAY,kBAAkB;GAC9B,IAAI,cAAc;GAClB,UAAU,QAAQ,aAAa,UAAU;EAC3C,GACA,EAAE,WAAW,KAAK,CACpB;;;;;EAMA,SAAS,eAAe,KAAiC;GACvD,IAAI,CAAC,KAAK,OAAO,KAAA;GAGjB,MAAM,SAAS,CAAC,IAAI,QAAQ,MAAM,EAAE;GACpC,MAAM,EAAE,aAAa;GAIrB,IAAI;GACJ,IAAI,MAAM,MAAM,GAAG;IACjB,IAAI,MAAM,UAAU,KAAA,GAAW,OAAO,KAAA;IACtC,SAAS,WAAW,GAAG,IAAI,MAAM,OAAO,QAAQ,IAAI,MAAM;GAC5D,OACE,SAAS;GAGX,IAAI,WAAW,KAAA,GAAW,OAAO,KAAA;GAEjC,MAAM,EAAE,WAAW,cAAc,iBAAiB;GAElD,MAAM,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,MAAM,aAAa;IAAE;IAAc;GAAa,CAAC;GAGhF,OAAO,WAAW,GAAG,IAAI,aAAa,QAAQ,IAAI;EACpD;;;;;EAMA,SAAS,cAA4C,KAAW;GAC9D,IAAI,QAAQ,KAAA,GAAW,OAAO;GAC9B,MAAM,EAAE,KAAK,KAAK,aAAa;GAG/B,IAAI,UAAU;IACZ,MAAM,SAAS,GAAG,IAAI,KAAK,QAAQ;IACnC,IAAI,cAAc;IAClB,IAAI,QAAQ,KAAA,KAAa,SAAS,KAAK,cAAc;IACrD,IAAI,QAAQ,KAAA,KAAa,SAAS,KAAK,cAAc;IACrD,OAAO,GAAG,IAAI,aAAa,QAAQ;GACrC;GAEA,IAAI,QAAQ,KAAA,KAAa,MAAM,KAAK,OAAO;GAC3C,IAAI,QAAQ,KAAA,KAAa,MAAM,KAAK,OAAO;GAC3C,OAAO;EACT;EAEA,SAAS,uBAAuB,OAAqB;GACnD,MAAM,SAAS,eAAe,KAAK;GACnC,MAAM,QAAQ,cAAc,MAAM;GAClC,UAAU,QAAQ;EACpB;EAEA,SAAS,cAAoB;GAC3B,IAAI,CAAC,UAAU,OAAO;GACtB,MAAM,QAAQ,KAAA;GACd,UAAU,QAAQ;GAClB,KAAK,OAAO;EACd;;;;;;EAOA,SAAS,eAAe;GACtB,KAAK,UAAU,MAAM,KAAK;EAC5B;EAEA,MAAM,QAAQ,IAAI,MAChB,EAAE,GAAG,MAAM,SAAS,EAAE,GACtB;GACE,SAAS,OAAO;IACd,MAAM,YAAY,SAAS;IAC3B,IAAI,CAAC,WAAW;IAChB,MAAM,EAAE,aAAa;IAGrB,UAAU,QAAQ,aADE,WAAW,GAAG,IAAI,MAAM,GAAG,QAAQ,IAAI,MAAM,CACvB;GAC5C;GAEA,aAAa;IACX,MAAM,YAAY,SAAS;IAC3B,IAAI,CAAC,WAAW;IAChB,UAAU,QAAQ,aAAa,MAAM,KAAK;GAC5C;EACF,CACF;;;;;;;EAQA,SAAS,kBAAkB,SAAiB,WAAyB;GACnE,MAAM,MAAM,IAAI;GAEhB,IAAI,QAAQ,UAAU,GAAG;IACvB,MAAM,MAAM,IAAI;IAChB,MAAM,YAAY,SAAS;IAC3B,IAAI,CAAC,WAAW;IAChB,MAAM,EAAE,aAAa;IACrB,UAAU,QAAQ,aAAa,WAAW,GAAG,IAAI,WAAW,QAAQ,IAAI,SAAS;IACjF;GACF;GAGA,MAAM,GAAG,EAAE,GAAG,UAAU,CAAC;EAC3B;;EAGA,SAAS,WAAiB;GACxB,IAAI,SAAS,OAAO;GACpB,MAAM,EAAE,aAAa;GACrB,MAAM,MAAM,MAAM,SAAS;GAE3B,IAAI,UAAU;IAEZ,MAAM,SAAS,GAAG,IAAI,KAAK,QAAQ;IAEnC,MAAM,YAAY,GAAG,KAAK,QAAQ,QAAQ,KAAK;IAE/C,MAAM,SAAS,cAAc,GAAG,IAAI,WAAW,QAAQ,CAAC;IACxD,MAAM,QAAQ;IACd,kBAAkB,GAAG,IAAI,KAAK,QAAQ,GAAG,GAAG,IAAI,QAAQ,QAAQ,CAAC;GACnE,OAAO;IACL,MAAM,SAAS,cAAc,GAAG,KAAK,KAAK,QAAQ,KAAK,CAAC;IACxD,MAAM,QAAQ;IACd,kBAAkB,KAAK,MAAM;GAC/B;EACF;;EAGA,SAAS,WAAiB;GACxB,IAAI,SAAS,OAAO;GACpB,MAAM,EAAE,aAAa;GACrB,MAAM,MAAM,MAAM,SAAS;GAE3B,IAAI,UAAU;IAEZ,MAAM,SAAS,GAAG,IAAI,KAAK,QAAQ;IAEnC,MAAM,YAAY,GAAG,MAAM,QAAQ,QAAQ,KAAK;IAEhD,MAAM,SAAS,cAAc,GAAG,IAAI,WAAW,QAAQ,CAAC;IACxD,MAAM,QAAQ;IACd,kBAAkB,GAAG,IAAI,KAAK,QAAQ,GAAG,GAAG,IAAI,QAAQ,QAAQ,CAAC;GACnE,OAAO;IACL,MAAM,SAAS,cAAc,GAAG,MAAM,KAAK,QAAQ,KAAK,CAAC;IACzD,MAAM,QAAQ;IACd,kBAAkB,KAAK,MAAM;GAC/B;EACF;EAEA,SAAS,cAAc,GAAwB;GAC7C,IAAI,CAAC,MAAM,MAAM;GACjB,IAAI,EAAE,QAAQ,WAAW;IACvB,EAAE,eAAe;IACjB,OAAO,SAAS;GAClB;GACA,IAAI,EAAE,QAAQ,aAAa;IACzB,EAAE,eAAe;IACjB,OAAO,SAAS;GAClB;EACF;EAEA,SAAS,cAAoB;GAC3B,QAAQ,QAAQ;GAGhB,IAAI,MAAM,UAAU,KAAA,GAAW;GAC/B,MAAM,EAAE,WAAW,cAAc,cAAc,aAAa;GAE5D,IAAI,UAAU;IAEZ,MAAM,SAAS,GAAG,IAAI,MAAM,OAAO,QAAQ;IAC3C,MAAM,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,MAAM,aAAa;KAAE;KAAc;IAAa,CAAC;IAChF,MAAM,QAAQ,GAAG,IAAI,aAAa,QAAQ;GAC5C,OACE,MAAM,QAAQ,CAAC,EAAE,MAAM,KAAK,CAAC,CAAC,MAAM,aAAa;IAAE;IAAc;GAAa,CAAC;EAEnF;EAEA,SAAS,aAAmB;GAC1B,QAAQ,QAAQ;GAChB,MAAM,QAAQ,MAAM;EACtB;EAEA,SAAS,mBAAyB;GAChC,QAAQ,QAAQ;EAClB;EAEA,SAAS,mBAAyB;GAChC,QAAQ,QAAQ;EAClB;;GAvZW,OAAA,CAAA,MAAA,QAAA,KADT,UAAA,GAAA,YAuDU,MAAA,aAAA,GAvDV,WAuDU;;IArDJ,SAAA;IAAJ,KAAI;IACH,OAAO,UAAA;IACP,eAAa,UAAA;GACN,GAAA,WAAA,OAAU;IACjB,uBAAoB;IACpB,UAAQ;IACR,WAAO,cAAO,eAAa,CAAA,MAAA,CAAA;IAC3B,SAAO;IACP,QAAM;IACN,cAAY;IACZ,cAAY;IACZ,MAAM,MAAA,IAAA;IACN,UAAU,MAAA,QAAA;IACV,UAAU,MAAA,QAAA;IACV,WAAW;GAEY,CAAA,GAAA,YAAA,EAAA,GAAA,EAAA,GAAA,CAAA,UAAA,QAAA;IAAb,MAAA;IACT,IAAA,cAaO,CAbP,mBAaO,QAAA,EAbA,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,QAAA,CAAA,EAAA,GAET,CAAA,MAAM,aADd,UAAA,GAAA,YAOS,MAAA,WAAA,GAAA;;KALN,OAAK,eAAA,CAAG,MAAA,GAAA,CAAG,CAAC,EAAC,OAAA,GAAW,MAAA,GAAA,CAAG,CAAC,GAAE,UAAA,CAAY,UAAA,KAAS,CAAA,CAAA;KACnD,OAAO,UAAA,QAAS,OAAU,KAAA;KAC1B,SAAK,cAAO,aAAW,CAAA,MAAA,CAAA;;KAExB,SAAA,cAAS,CAAT,YAAS,MAAA,KAAA,CAAA,CAAA,CAAA;;IAEC,GAAA,GAAA,CAAA,SAAA,OAAA,CAAA,KAAA,mBAAA,QAAA,IAAA,GAAA,gBAAA,SAAZ,UAAA,GAAA,mBAGO,QAAA;;KAHuB,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,gBAAA,CAAA;IACrC,GAAA,CAAA,gBAAA,gBAAA,QAAA,MAAM,IAAG,KACZ,CAAA,GAAA,WAAsB,KAAA,QAAA,QAAA,CAAA,GAAA,CAAA,KAAA,mBAAA,QAAA,IAAA,CAAA,GAAA,CAIf,GAAA,SAAA,SAAX,UAAA,GAAA,mBAeM,OAAA;;KAfgB,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA,CAAA;IAChC,GAAA,CAAA,gBAAA,UAAA,GAAA,YAMS,MAAA,WAAA,GAAA;KALN,SAAO;KAEP,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,GAAE,YAAa,MAAA,QAAA,KAAQ,CAAK,YAAA,KAAW,CAAA;;KAEnD,SAAA,cAAW,CAAX,YAAW,MAAA,OAAA,CAAA,CAAA,CAAA;;IAHA,GAAA,GAAA,CAAA,OAAA,CAAA,IAAA,CAAA,CAAA,MAAA,OAAA,GAAA,CAAA,MAAA,QAAA,KAAY,YAAA,KAAW,CAAA,CAAA,GAKpC,gBAAA,UAAA,GAAA,YAMS,MAAA,WAAA,GAAA;KALN,SAAO;KAEP,OAAK,eAAE,MAAA,GAAA,CAAG,CAAC,GAAE,YAAa,MAAA,QAAA,KAAQ,CAAK,UAAA,KAAS,CAAA;;KAEjD,SAAA,cAAa,CAAb,YAAa,MAAA,SAAA,CAAA,CAAA,CAAA;;IAHF,GAAA,GAAA,CAAA,OAAA,CAAA,IAAA,CAAA,CAAA,MAAA,OAAA,GAAA,CAAA,MAAA,QAAA,KAAY,UAAA,KAAS,CAAA,CAAA,CAAA,GAAA,CAAA,KAAA,mBAAA,QAAA,IAAA,CAAA,CAAA;;GAQd,IAAA,KAAA,GAAA,MAAM,SAAA;IAAnB,MAAA;IACT,IAAA,cAAsB,CAAtB,WAAsB,KAAA,QAAA,QAAA,CAAA,CAAA;;;;;;;;GAI1B,CAAA,MAAA,UAAA,GAAA,mBAEW,UAAA,EAAA,KAAA,EAAA,GAAA,CADN,gBAAA,gBAAA,kBAAA,SAAqB,MAAA,kBAAA,CAAkB,GAAA,CAAA,CAAA,GAAA,EAAA"}
|
|
1
|
+
{"version":3,"file":"number-input.js","names":["_useSlots","_useModel","_unref","_openBlock","_createBlock","UInput","_mergeProps","_withModifiers","_createSlots","_withCtx","_createElementVNode","_normalizeClass","UIcon","_createVNode","_createCommentVNode","_createElementBlock","_createTextVNode","_toDisplayString","_renderSlot","_withDirectives","_Fragment"],"sources":["../../../src/components/number-input/number-input.vue"],"sourcesContent":["<template>\n <u-input\n v-if=\"!readonly\"\n ref=\"inputRef\"\n :class=\"className\"\n :model-value=\"displayed\"\n v-bind=\"inputProps\"\n @update:model-value=\"handleUpdateModelValue\"\n @change=\"handleChange\"\n @keydown.stop=\"handleKeydown\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n @mouseenter=\"handleMouseEnter\"\n @mouseleave=\"handleMouseLeave\"\n :size=\"size\"\n :readonly=\"readonly\"\n :disabled=\"disabled\"\n :clearable=\"false\"\n >\n <template #suffix v-if=\"hasSuffix\">\n <span :class=\"cls.e('suffix')\">\n <u-icon\n v-if=\"props.clearable\"\n :class=\"[cls.e('clear'), bem.is('hidden', !showClear)]\"\n :title=\"showClear ? '清除' : undefined\"\n @click.stop=\"handleClear\"\n >\n <Close />\n </u-icon>\n <span v-if=\"hasCustomSuffix\" :class=\"cls.e('suffix-content')\">\n {{ suffix }}\n <slot name=\"suffix\" />\n </span>\n </span>\n\n <div v-if=\"showStep\" :class=\"cls.e('step')\">\n <u-icon\n @click=\"increase\"\n v-ripple=\"!disabled && increasable\"\n :class=\"bem.is('disabled', disabled || !increasable)\"\n >\n <ArrowUp />\n </u-icon>\n <u-icon\n @click=\"decrease\"\n v-ripple=\"!disabled && reducible\"\n :class=\"bem.is('disabled', disabled || !reducible)\"\n >\n <ArrowDown />\n </u-icon>\n </div>\n </template>\n\n <template #prefix v-if=\"slots.prefix\">\n <slot name=\"prefix\" />\n </template>\n </u-input>\n\n <template v-else>\n {{ generateDisplayed || FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { $n, n, o, isUndef } from '@cat-kit/core'\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { vRipple } from '@veltra/directives'\nimport { ArrowDown, ArrowUp, Close } from '@veltra/icons/normal'\nimport { bem, FORM_EMPTY_CONTENT, Tween } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed, shallowRef, useAttrs, watch } from 'vue'\n\nimport type { NumberInputEmits, NumberInputProps, InputExposed } from '../../types'\nimport { UIcon } from '../icon'\nimport { UInput } from '../input'\n\ndefineOptions({ name: 'UNumberInput', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<NumberInputProps>(), {\n placeholder: '请输入',\n clearable: true,\n disabled: undefined,\n readonly: undefined\n})\nconst emit = defineEmits<NumberInputEmits>()\n\nconst slots = defineSlots<{ prefix?: () => any; suffix?: () => any }>()\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\nconst attrs = useAttrs()\n\nconst inputProps = computed(() => ({\n ...attrs,\n ...o(props).pick(['disabled', 'placeholder', 'size', 'prefix'])\n}))\n\nconst inputRef = shallowRef<InputExposed>()\n\nconst inputDom = computed(() => inputRef.value?.el)\n\nconst cls = bem('number-input')\n\nconst className = computed(() => {\n return [cls.b, cls.m(size.value)]\n})\n\n/** 实际值 */\nconst model = defineModel<NumberInputProps['modelValue']>()\n\n// 展示值\nconst displayed = shallowRef('')\n\nconst focused = shallowRef(false)\nconst hovered = shallowRef(false)\n\nconst generateDisplayed = computed(() => {\n if (!displayed.value) return ''\n\n return `${props.prefix ?? ''}${displayed.value}${props.suffix ?? ''}`\n})\n\nconst showStep = computed(() => props.step !== undefined && props.step !== false)\n\nconst hasCustomSuffix = computed(() => !!props.suffix || !!slots.suffix)\n\nconst hasSuffix = computed(() => props.clearable || hasCustomSuffix.value || showStep.value)\n\nconst showClear = computed(() => {\n return props.clearable && !disabled.value && displayed.value !== '' && hovered.value\n})\n\n/** 步长 */\nconst stepVal = computed<number>(() => {\n const { step } = props\n if (step === undefined) return 1\n return typeof step === 'boolean' ? 1 : step\n})\n\n/** 是否可增 */\nconst increasable = computed(() => {\n const { max, multiple } = props\n if (isUndef(max) || isUndef(model.value)) return true\n // 如果存在倍数,先将 model.value 除以倍数得到原始值再比较\n const rawValue = multiple ? $n.div(model.value, multiple) : model.value\n return rawValue < max\n})\n\n/** 是否可减 */\nconst reducible = computed(() => {\n const { min, multiple } = props\n if (isUndef(min) || isUndef(model.value)) return true\n // 如果存在倍数,先将 model.value 除以倍数得到原始值再比较\n const rawValue = multiple ? $n.div(model.value, multiple) : model.value\n return rawValue > min\n})\n\n// 通过值和步长值计算默认的最大精度\nconst defaultMaxPrecision = computed(() => {\n const { multiple } = props\n // 如果存在倍数,基于原始值计算精度\n const rawValue =\n multiple && model.value !== undefined ? $n.div(model.value, multiple) : model.value\n return Math.max(\n String(rawValue).split('.')[1]?.length ?? 0,\n String(stepVal.value).split('.')[1]?.length ?? 0\n )\n})\n\n/**\n * 获取展示值\n * @param num 实际值\n */\nfunction getDisplayed(num?: number): string {\n if (!num && num !== 0) return ''\n\n const {\n currency,\n precision,\n minPrecision,\n // 如果没有指定最大精度那么设置默认为值和步长值中的较大值\n maxPrecision = defaultMaxPrecision.value,\n multiple\n } = props\n\n // 如果存在倍数,先将实际值除以倍数得到原始值\n const displayValue = multiple ? $n.div(num, multiple) : num\n\n return currency\n ? n(displayValue).currency('CNY', { precision, minPrecision, maxPrecision })\n : n(displayValue).fixed(precision ?? { minPrecision, maxPrecision })\n}\n\nwatch(\n [model, focused, () => props.currency],\n ([modelValue, inputFocused]) => {\n if (inputFocused) return\n displayed.value = getDisplayed(modelValue)\n },\n { immediate: true }\n)\n\n/**\n * 解析展示值\n * @param str 展示值\n */\nfunction parseDisplayed(str: string): number | undefined {\n if (!str) return undefined\n\n // 将货币格式去掉再转化为数字\n const number = +str.replace(/,/g, '')\n const { multiple } = props\n\n // 如果解析失败,使用当前值作为回退\n // 如果存在倍数,需要先将 model.value 除以倍数得到原始值\n let result: number | undefined\n if (isNaN(number)) {\n if (model.value === undefined) return undefined\n result = multiple ? $n.div(model.value, multiple) : model.value\n } else {\n result = number\n }\n\n if (result === undefined) return undefined\n\n const { precision, maxPrecision, minPrecision } = props\n\n const fixedResult = +n(result).fixed(precision ?? { minPrecision, maxPrecision })\n\n // 如果存在倍数,将原始值乘以倍数返回实际值\n return multiple ? $n.mul(fixedResult, multiple) : fixedResult\n}\n\n/**\n * 获取有效值\n * @param val 值\n */\nfunction getValidValue<T extends undefined | number>(val: T): T {\n if (val === undefined) return val\n const { min, max, multiple } = props\n\n // 如果存在倍数,先将值除以倍数得到原始值进行验证,验证后再乘以倍数\n if (multiple) {\n const rawVal = $n.div(val, multiple)\n let validRawVal = rawVal\n if (min !== undefined && rawVal < min) validRawVal = min\n if (max !== undefined && rawVal > max) validRawVal = max\n return $n.mul(validRawVal, multiple) as T\n }\n\n if (min !== undefined && val < min) return min as T\n if (max !== undefined && val > max) return max as T\n return val\n}\n\nfunction handleUpdateModelValue(input: string): void {\n const newVal = parseDisplayed(input)\n model.value = getValidValue(newVal)\n displayed.value = input\n}\n\nfunction handleClear(): void {\n if (!showClear.value) return\n model.value = undefined\n displayed.value = ''\n emit('clear')\n}\n\n/**\n * 处理输入值变化的函数, 该函数仅在输入框失去焦点时触发,\n * 主要用于在输入非数字的情况下的修正处理\n * @param input 输入的值\n */\nfunction handleChange() {\n emit('change', model.value)\n}\n\nconst tween = new Tween(\n { n: model.value ?? 0 },\n {\n onUpdate(state) {\n const _rawInput = inputDom.value\n if (!_rawInput) return\n const { multiple } = props\n // 如果存在倍数,tween.state.n 存储的是原始值,需要乘以倍数后传给 getDisplayed\n const actualValue = multiple ? $n.mul(state.n, multiple) : state.n\n _rawInput.value = getDisplayed(actualValue)\n },\n // 动画进行的过程值有可能被改变, 因此在onComplete中确保还原的是原本的值\n onComplete() {\n const _rawInput = inputDom.value\n if (!_rawInput) return\n _rawInput.value = getDisplayed(model.value)\n }\n }\n)\n\n/**\n * 步进后更新输入框的展示值\n * 步长为 1 时直接展示目标值, 不播放数字滚动动画\n * @param rawFrom 步进前的原始值(存在倍数时为除以倍数后的值)\n * @param rawTarget 步进后的原始值(存在倍数时为除以倍数后的值)\n */\nfunction updateStepDisplay(rawFrom: number, rawTarget: number): void {\n tween.state.n = rawFrom\n\n if (stepVal.value === 1) {\n tween.state.n = rawTarget\n const _rawInput = inputDom.value\n if (!_rawInput) return\n const { multiple } = props\n _rawInput.value = getDisplayed(multiple ? $n.mul(rawTarget, multiple) : rawTarget)\n return\n }\n\n // tween 动画在原始值上进行\n tween.to({ n: rawTarget })\n}\n\n/** 增 */\nfunction increase(): void {\n if (disabled.value) return\n const { multiple } = props\n const val = model.value ?? 0\n\n if (multiple) {\n // 如果存在倍数,先将实际值除以倍数得到原始值\n const rawVal = $n.div(val, multiple)\n // 在原始值基础上加步长\n const newRawVal = $n.plus(rawVal, stepVal.value)\n // 乘以倍数得到新的实际值\n const target = getValidValue($n.mul(newRawVal, multiple))\n model.value = target\n updateStepDisplay($n.div(val, multiple), $n.div(target, multiple))\n } else {\n const target = getValidValue($n.plus(val, stepVal.value))\n model.value = target\n updateStepDisplay(val, target)\n }\n}\n\n/** 减 */\nfunction decrease(): void {\n if (disabled.value) return\n const { multiple } = props\n const val = model.value ?? 0\n\n if (multiple) {\n // 如果存在倍数,先将实际值除以倍数得到原始值\n const rawVal = $n.div(val, multiple)\n // 在原始值基础上减步长\n const newRawVal = $n.minus(rawVal, stepVal.value)\n // 乘以倍数得到新的实际值\n const target = getValidValue($n.mul(newRawVal, multiple))\n model.value = target\n updateStepDisplay($n.div(val, multiple), $n.div(target, multiple))\n } else {\n const target = getValidValue($n.minus(val, stepVal.value))\n model.value = target\n updateStepDisplay(val, target)\n }\n}\n\nfunction handleKeydown(e: KeyboardEvent): void {\n if (!props.step) return\n if (e.key === 'ArrowUp') {\n e.preventDefault()\n return increase()\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n return decrease()\n }\n}\n\nfunction handleFocus(): void {\n focused.value = true\n\n // 如果初始值和当前设置的精度不匹配则进行精度修正\n if (model.value === undefined) return\n const { precision, maxPrecision, minPrecision, multiple } = props\n\n if (multiple) {\n // 如果存在倍数,先除以倍数得到原始值进行精度修正,再乘以倍数\n const rawVal = $n.div(model.value, multiple)\n const fixedRawVal = +n(rawVal).fixed(precision ?? { maxPrecision, minPrecision })\n model.value = $n.mul(fixedRawVal, multiple)\n } else {\n model.value = +n(model.value).fixed(precision ?? { maxPrecision, minPrecision })\n }\n}\n\nfunction handleBlur(): void {\n focused.value = false\n model.value = props.modelValue\n}\n\nfunction handleMouseEnter(): void {\n hovered.value = true\n}\n\nfunction handleMouseLeave(): void {\n hovered.value = false\n}\n</script>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"number-range-input.js","names":["$attrs"],"sources":["../../../src/components/number-range-input/number-range-input.vue"],"sourcesContent":["<template>\n <div v-if=\"!readonly\" v-bind=\"$attrs\" :class=\"className\">\n <u-number-input\n v-model=\"startModel\"\n :placeholder=\"startPlaceholder\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :size=\"size\"\n v-bind=\"numberInputBind\"\n @change=\"handleStartChange\"\n />\n <span :class=\"cls.e('separator')\">{{ separator }}</span>\n <u-number-input\n v-model=\"endModel\"\n :placeholder=\"endPlaceholder\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :size=\"size\"\n v-bind=\"numberInputBind\"\n @change=\"handleEndChange\"\n />\n </div>\n\n <template v-else>\n {{ readonlyText || FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { n, $n, o } from '@cat-kit/core'\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed, getCurrentInstance, nextTick, onMounted, watch } from 'vue'\n\nimport type { NumberRangeInputEmits, NumberRangeInputProps, NumberRangeTuple } from '../../types'\nimport { UNumberInput } from '../number-input'\n\ndefineOptions({ name: 'UNumberRangeInput', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<NumberRangeInputProps>(), {\n startPlaceholder: '请输入',\n endPlaceholder: '请输入',\n separator: '~',\n clearable: true,\n disabled: undefined,\n readonly: undefined\n})\n\nconst emit = defineEmits<NumberRangeInputEmits>()\n\nconst inst = getCurrentInstance()\n\nfunction splitBound(): boolean {\n const p = inst?.vnode.props\n if (!p) return false\n return 'start' in p || 'onUpdate:start' in p || 'end' in p || 'onUpdate:end' in p\n}\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\nconst cls = bem('number-range-input')\n\nconst className = computed(() => {\n return [cls.b, cls.m(size.value)]\n})\n\nconst model = defineModel<NumberRangeTuple>({ default: () => [undefined, undefined] })\n\nconst startRef = defineModel<number | undefined>('start')\nconst endRef = defineModel<number | undefined>('end')\n\nlet syncGuard = false\n\nfunction normalizeFromSplit(s: number | undefined, e: number | undefined): NumberRangeTuple {\n // 外部 split 写入无法区分哪一侧后改,统一将越界的 end 抬到 start\n if (s !== undefined && e !== undefined && s > e) return [s, s]\n return [s, e]\n}\n\nwatch(\n model,\n (t) => {\n if (syncGuard) return\n syncGuard = true\n const tuple = t ?? [undefined, undefined]\n if (startRef.value !== tuple[0]) startRef.value = tuple[0]\n if (endRef.value !== tuple[1]) endRef.value = tuple[1]\n nextTick(() => {\n syncGuard = false\n })\n },\n { deep: true }\n)\n\nwatch(\n [startRef, endRef],\n () => {\n if (!splitBound() || syncGuard) return\n syncGuard = true\n const normalized = normalizeFromSplit(startRef.value, endRef.value)\n const cur = model.value ?? [undefined, undefined]\n if (cur[0] !== normalized[0] || cur[1] !== normalized[1]) {\n model.value = normalized\n }\n nextTick(() => {\n syncGuard = false\n })\n },\n { deep: true }\n)\n\nonMounted(() => {\n if (!splitBound()) return\n const cur = model.value ?? [undefined, undefined]\n const hasModel = cur[0] !== undefined || cur[1] !== undefined\n if (hasModel) return\n const normalized = normalizeFromSplit(startRef.value, endRef.value)\n if (cur[0] !== normalized[0] || cur[1] !== normalized[1]) {\n syncGuard = true\n model.value = normalized\n nextTick(() => {\n syncGuard = false\n })\n }\n})\n\nconst numberInputBind = computed(() => {\n return o(props).pick([\n 'clearable',\n 'prefix',\n 'suffix',\n 'step',\n 'min',\n 'max',\n 'currency',\n 'precision',\n 'minPrecision',\n 'maxPrecision',\n 'multiple'\n ])\n})\n\nconst startModel = computed({\n get(): number | undefined {\n return model.value?.[0]\n },\n set(v: number | undefined) {\n // 输入过程只更新单侧,交叉约束放到 change(失焦)时处理\n const cur = model.value ?? [undefined, undefined]\n model.value = [v, cur[1]]\n }\n})\n\nconst endModel = computed({\n get(): number | undefined {\n return model.value?.[1]\n },\n set(v: number | undefined) {\n const cur = model.value ?? [undefined, undefined]\n model.value = [cur[0], v]\n }\n})\n\nfunction formatNumberPart(num: number): string {\n const { currency, precision, minPrecision, maxPrecision, multiple } = props\n\n const displayValue = multiple ? $n.div(num, multiple) : num\n\n return currency\n ? n(displayValue).currency('CNY', { precision, minPrecision, maxPrecision })\n : n(displayValue).fixed(precision ?? { minPrecision, maxPrecision })\n}\n\nconst readonlyText = computed(() => {\n const [s, e] = model.value ?? [undefined, undefined]\n if (s === undefined && e === undefined) return ''\n const p = props.prefix ?? ''\n const sfx = props.suffix ?? ''\n const sep = props.separator ?? '~'\n const a = s === undefined ? '—' : formatNumberPart(s)\n const b = e === undefined ? '—' : formatNumberPart(e)\n return `${p}${a} ${sep} ${b}${sfx}`\n})\n\nfunction handleStartChange(): void {\n const [start, end] = model.value ?? [undefined, undefined]\n // 失焦时只校正刚改的一侧:start > end 时把 start 压回 end\n let next: NumberRangeTuple = [start, end]\n if (start !== undefined && end !== undefined && start > end) {\n next = [end, end]\n model.value = next\n }\n emit('change', next)\n}\n\nfunction handleEndChange(): void {\n const [start, end] = model.value ?? [undefined, undefined]\n // 失焦时只校正刚改的一侧:end < start 时把 end 抬回 start\n let next: NumberRangeTuple = [start, end]\n if (start !== undefined && end !== undefined && end < start) {\n next = [start, start]\n model.value = next\n }\n emit('change', next)\n}\n</script>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"number-range-input.js","names":["$attrs","_useModel","_unref","_openBlock","_createElementBlock","_mergeProps","_createVNode","UNumberInput","_createElementVNode","_normalizeClass","_toDisplayString","_Fragment","_createTextVNode"],"sources":["../../../src/components/number-range-input/number-range-input.vue"],"sourcesContent":["<template>\n <div v-if=\"!readonly\" v-bind=\"$attrs\" :class=\"className\">\n <u-number-input\n v-model=\"startModel\"\n :placeholder=\"startPlaceholder\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :size=\"size\"\n v-bind=\"numberInputBind\"\n @change=\"handleStartChange\"\n />\n <span :class=\"cls.e('separator')\">{{ separator }}</span>\n <u-number-input\n v-model=\"endModel\"\n :placeholder=\"endPlaceholder\"\n :disabled=\"disabled\"\n :readonly=\"readonly\"\n :size=\"size\"\n v-bind=\"numberInputBind\"\n @change=\"handleEndChange\"\n />\n </div>\n\n <template v-else>\n {{ readonlyText || FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { n, $n, o } from '@cat-kit/core'\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed, getCurrentInstance, nextTick, onMounted, watch } from 'vue'\n\nimport type { NumberRangeInputEmits, NumberRangeInputProps, NumberRangeTuple } from '../../types'\nimport { UNumberInput } from '../number-input'\n\ndefineOptions({ name: 'UNumberRangeInput', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<NumberRangeInputProps>(), {\n startPlaceholder: '请输入',\n endPlaceholder: '请输入',\n separator: '~',\n clearable: true,\n disabled: undefined,\n readonly: undefined\n})\n\nconst emit = defineEmits<NumberRangeInputEmits>()\n\nconst inst = getCurrentInstance()\n\nfunction splitBound(): boolean {\n const p = inst?.vnode.props\n if (!p) return false\n return 'start' in p || 'onUpdate:start' in p || 'end' in p || 'onUpdate:end' in p\n}\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\nconst cls = bem('number-range-input')\n\nconst className = computed(() => {\n return [cls.b, cls.m(size.value)]\n})\n\nconst model = defineModel<NumberRangeTuple>({ default: () => [undefined, undefined] })\n\nconst startRef = defineModel<number | undefined>('start')\nconst endRef = defineModel<number | undefined>('end')\n\nlet syncGuard = false\n\nfunction normalizeFromSplit(s: number | undefined, e: number | undefined): NumberRangeTuple {\n // 外部 split 写入无法区分哪一侧后改,统一将越界的 end 抬到 start\n if (s !== undefined && e !== undefined && s > e) return [s, s]\n return [s, e]\n}\n\nwatch(\n model,\n (t) => {\n if (syncGuard) return\n syncGuard = true\n const tuple = t ?? [undefined, undefined]\n if (startRef.value !== tuple[0]) startRef.value = tuple[0]\n if (endRef.value !== tuple[1]) endRef.value = tuple[1]\n nextTick(() => {\n syncGuard = false\n })\n },\n { deep: true }\n)\n\nwatch(\n [startRef, endRef],\n () => {\n if (!splitBound() || syncGuard) return\n syncGuard = true\n const normalized = normalizeFromSplit(startRef.value, endRef.value)\n const cur = model.value ?? [undefined, undefined]\n if (cur[0] !== normalized[0] || cur[1] !== normalized[1]) {\n model.value = normalized\n }\n nextTick(() => {\n syncGuard = false\n })\n },\n { deep: true }\n)\n\nonMounted(() => {\n if (!splitBound()) return\n const cur = model.value ?? [undefined, undefined]\n const hasModel = cur[0] !== undefined || cur[1] !== undefined\n if (hasModel) return\n const normalized = normalizeFromSplit(startRef.value, endRef.value)\n if (cur[0] !== normalized[0] || cur[1] !== normalized[1]) {\n syncGuard = true\n model.value = normalized\n nextTick(() => {\n syncGuard = false\n })\n }\n})\n\nconst numberInputBind = computed(() => {\n return o(props).pick([\n 'clearable',\n 'prefix',\n 'suffix',\n 'step',\n 'min',\n 'max',\n 'currency',\n 'precision',\n 'minPrecision',\n 'maxPrecision',\n 'multiple'\n ])\n})\n\nconst startModel = computed({\n get(): number | undefined {\n return model.value?.[0]\n },\n set(v: number | undefined) {\n // 输入过程只更新单侧,交叉约束放到 change(失焦)时处理\n const cur = model.value ?? [undefined, undefined]\n model.value = [v, cur[1]]\n }\n})\n\nconst endModel = computed({\n get(): number | undefined {\n return model.value?.[1]\n },\n set(v: number | undefined) {\n const cur = model.value ?? [undefined, undefined]\n model.value = [cur[0], v]\n }\n})\n\nfunction formatNumberPart(num: number): string {\n const { currency, precision, minPrecision, maxPrecision, multiple } = props\n\n const displayValue = multiple ? $n.div(num, multiple) : num\n\n return currency\n ? n(displayValue).currency('CNY', { precision, minPrecision, maxPrecision })\n : n(displayValue).fixed(precision ?? { minPrecision, maxPrecision })\n}\n\nconst readonlyText = computed(() => {\n const [s, e] = model.value ?? [undefined, undefined]\n if (s === undefined && e === undefined) return ''\n const p = props.prefix ?? ''\n const sfx = props.suffix ?? ''\n const sep = props.separator ?? '~'\n const a = s === undefined ? '—' : formatNumberPart(s)\n const b = e === undefined ? '—' : formatNumberPart(e)\n return `${p}${a} ${sep} ${b}${sfx}`\n})\n\nfunction handleStartChange(): void {\n const [start, end] = model.value ?? [undefined, undefined]\n // 失焦时只校正刚改的一侧:start > end 时把 start 压回 end\n let next: NumberRangeTuple = [start, end]\n if (start !== undefined && end !== undefined && start > end) {\n next = [end, end]\n model.value = next\n }\n emit('change', next)\n}\n\nfunction handleEndChange(): void {\n const [start, end] = model.value ?? [undefined, undefined]\n // 失焦时只校正刚改的一侧:end < start 时把 end 抬回 start\n let next: NumberRangeTuple = [start, end]\n if (start !== undefined && end !== undefined && end < start) {\n next = [start, start]\n model.value = next\n }\n emit('change', next)\n}\n</script>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paginator.js","names":[],"sources":["../../../src/components/paginator/paginator.vue"],"sourcesContent":["<template>\n <div :class=\"[cls.b, cls.m(size)]\" ref=\"paginatorRef\">\n <div>共 {{ total }} 条</div>\n\n <u-select\n :class=\"cls.e('size-select')\"\n v-model=\"pageSize\"\n size=\"small\"\n :options=\"sizeOptions\"\n :clearable=\"false\"\n @change=\"handleChangePageSize\"\n />\n\n <ul :class=\"[cls.e('pages')]\" v-if=\"!simple\">\n <li\n :class=\"[cls.e('btn'), bem.is('disabled', preDisabled)]\"\n @click=\"handleJumpToFirst\"\n @mouseenter=\"hovered.first = true\"\n @mouseleave=\"hovered.first = false\"\n v-ripple=\"!preDisabled\"\n >\n <span v-if=\"hovered.first\">1</span>\n <UIcon v-else><DArrowLeft /></UIcon>\n </li>\n\n <li\n :class=\"[cls.e('btn'), bem.is('disabled', pageNumber === 1)]\"\n @click=\"handleJumpToPrev\"\n v-ripple=\"!preDisabled\"\n >\n <UIcon><ArrowLeft /></UIcon>\n </li>\n\n <li\n v-for=\"num in pageNumbers\"\n :key=\"num\"\n :class=\"[cls.e('btn'), bem.is('active', pageNumber === num)]\"\n @click=\"handleChangePageNumber(num)\"\n v-ripple\n >\n {{ num }}\n </li>\n\n <li\n :class=\"[cls.e('btn'), bem.is('disabled', nextDisabled)]\"\n @click=\"handleJumpToNext\"\n v-ripple=\"!nextDisabled\"\n >\n <UIcon><ArrowRight /></UIcon>\n </li>\n <li\n :class=\"[cls.e('btn'), bem.is('disabled', nextDisabled)]\"\n @click=\"handleJumpToLast\"\n @mouseenter=\"hovered.last = true\"\n @mouseleave=\"hovered.last = false\"\n v-ripple=\"!nextDisabled\"\n >\n <span v-if=\"hovered.last\">{{ totalPages }}</span>\n <UIcon v-else><DArrowRight /></UIcon>\n </li>\n </ul>\n\n <div :class=\"cls.e('jumper')\">\n <span>前往</span>\n <u-number-input\n :class=\"cls.e('page-input')\"\n size=\"small\"\n :min=\"1\"\n :max=\"totalPages\"\n :precision=\"0\"\n :model-value=\"pageNumber\"\n :clearable=\"false\"\n @keyup.enter=\"handleKeyEnter\"\n @change=\"pageNumber = $event!\"\n />\n <span>/ {{ totalPages }}</span>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { n } from '@cat-kit/core'\nimport { useConfig, useFallbackProps } from '@veltra/compositions'\nimport { vRipple } from '@veltra/directives'\nimport { ArrowLeft, ArrowRight, DArrowLeft, DArrowRight } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed, reactive, shallowRef } from 'vue'\n\nimport type { PaginatorProps, PaginatorEmits, _PaginatorExposed, ComponentSize } from '../../types'\nimport { UIcon } from '../icon'\nimport { UNumberInput } from '../number-input'\nimport { USelect } from '../select'\n\ndefineOptions({ name: 'UPaginator' })\n\nconst { config } = useConfig()\n\nconst props = withDefaults(defineProps<PaginatorProps>(), { total: 0 })\n\nconst emit = defineEmits<PaginatorEmits>()\n\nconst cls = bem('paginator')\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst pageNumber = defineModel<number>('pageNumber', { default: 1 })\n\nconst pageSize = defineModel<number>('pageSize', { default: 10 })\n\nfunction emitPageSize(value: number) {\n emit('change:pageSize', value)\n}\n\nfunction emitPageNumber(value: number) {\n emit('change:pageNumber', value)\n}\n\nconst handleChangePageSize = (size?: Record<string, any>) => {\n emitPageSize(size?.value)\n pageNumber.value = 1\n}\n\nfunction handleChangePageNumber(num: number) {\n if (props.pageNumber === num) return\n pageNumber.value = num\n emitPageNumber(pageNumber.value)\n}\n\nconst currentSize = computed(() => {\n return props.pageSize ?? config.paginator.pageSize\n})\n\n/** 完整页码 */\nconst totalPages = computed(() => {\n return Math.ceil(props.total / currentSize.value)\n})\n\nconst sizeOptions = computed(() => {\n return (props.pageSizeOptions ?? config.paginator.pageSizeOptions).map((value) => {\n return { label: `${value}条`, value }\n })\n})\n\n/** 做多显示5个页码 */\nconst pageNumbers = computed(() => {\n const startPageNum = n(pageNumber.value - 2).range(1, Math.max(totalPages.value - 4, 1))\n\n return Array.from({ length: Math.min(totalPages.value, 5) }).map(\n (_, index) => startPageNum + index\n )\n})\n\nconst preDisabled = computed(() => {\n return pageNumber.value <= 1\n})\nconst nextDisabled = computed(() => {\n return pageNumber.value >= totalPages.value\n})\n\nfunction handleJumpToFirst() {\n if (preDisabled.value) return\n pageNumber.value = 1\n emitPageNumber(pageNumber.value)\n}\nfunction handleJumpToLast() {\n if (nextDisabled.value) return\n pageNumber.value = totalPages.value\n emitPageNumber(pageNumber.value)\n}\nfunction handleJumpToPrev() {\n if (preDisabled.value) return\n pageNumber.value = pageNumber.value - 1\n emitPageNumber(pageNumber.value)\n}\nfunction handleJumpToNext() {\n if (nextDisabled.value) return\n\n pageNumber.value = pageNumber.value + 1\n emitPageNumber(pageNumber.value)\n}\n\nfunction handleKeyEnter(e: KeyboardEvent) {\n const target = e.target as HTMLInputElement\n const val = +target.value\n if (!isNaN(val) && val > 0 && val <= totalPages.value) {\n pageNumber.value = val\n emitPageNumber(pageNumber.value)\n }\n}\n\n/** 鼠标停留位置 */\nconst hovered = reactive({ first: false, last: false })\n\nconst paginatorRef = shallowRef<HTMLElement>()\n\ndefineExpose<_PaginatorExposed>({ el: paginatorRef })\n</script>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"paginator.js","names":["_useModel","_openBlock","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_toDisplayString","_createVNode","USelect","_withDirectives","_createBlock","UIcon","_withCtx","_Fragment","_renderList","_createTextVNode","_createCommentVNode","UNumberInput","_withKeys"],"sources":["../../../src/components/paginator/paginator.vue"],"sourcesContent":["<template>\n <div :class=\"[cls.b, cls.m(size)]\" ref=\"paginatorRef\">\n <div>共 {{ total }} 条</div>\n\n <u-select\n :class=\"cls.e('size-select')\"\n v-model=\"pageSize\"\n size=\"small\"\n :options=\"sizeOptions\"\n :clearable=\"false\"\n @change=\"handleChangePageSize\"\n />\n\n <ul :class=\"[cls.e('pages')]\" v-if=\"!simple\">\n <li\n :class=\"[cls.e('btn'), bem.is('disabled', preDisabled)]\"\n @click=\"handleJumpToFirst\"\n @mouseenter=\"hovered.first = true\"\n @mouseleave=\"hovered.first = false\"\n v-ripple=\"!preDisabled\"\n >\n <span v-if=\"hovered.first\">1</span>\n <UIcon v-else><DArrowLeft /></UIcon>\n </li>\n\n <li\n :class=\"[cls.e('btn'), bem.is('disabled', pageNumber === 1)]\"\n @click=\"handleJumpToPrev\"\n v-ripple=\"!preDisabled\"\n >\n <UIcon><ArrowLeft /></UIcon>\n </li>\n\n <li\n v-for=\"num in pageNumbers\"\n :key=\"num\"\n :class=\"[cls.e('btn'), bem.is('active', pageNumber === num)]\"\n @click=\"handleChangePageNumber(num)\"\n v-ripple\n >\n {{ num }}\n </li>\n\n <li\n :class=\"[cls.e('btn'), bem.is('disabled', nextDisabled)]\"\n @click=\"handleJumpToNext\"\n v-ripple=\"!nextDisabled\"\n >\n <UIcon><ArrowRight /></UIcon>\n </li>\n <li\n :class=\"[cls.e('btn'), bem.is('disabled', nextDisabled)]\"\n @click=\"handleJumpToLast\"\n @mouseenter=\"hovered.last = true\"\n @mouseleave=\"hovered.last = false\"\n v-ripple=\"!nextDisabled\"\n >\n <span v-if=\"hovered.last\">{{ totalPages }}</span>\n <UIcon v-else><DArrowRight /></UIcon>\n </li>\n </ul>\n\n <div :class=\"cls.e('jumper')\">\n <span>前往</span>\n <u-number-input\n :class=\"cls.e('page-input')\"\n size=\"small\"\n :min=\"1\"\n :max=\"totalPages\"\n :precision=\"0\"\n :model-value=\"pageNumber\"\n :clearable=\"false\"\n @keyup.enter=\"handleKeyEnter\"\n @change=\"pageNumber = $event!\"\n />\n <span>/ {{ totalPages }}</span>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { n } from '@cat-kit/core'\nimport { useConfig, useFallbackProps } from '@veltra/compositions'\nimport { vRipple } from '@veltra/directives'\nimport { ArrowLeft, ArrowRight, DArrowLeft, DArrowRight } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed, reactive, shallowRef } from 'vue'\n\nimport type { PaginatorProps, PaginatorEmits, _PaginatorExposed, ComponentSize } from '../../types'\nimport { UIcon } from '../icon'\nimport { UNumberInput } from '../number-input'\nimport { USelect } from '../select'\n\ndefineOptions({ name: 'UPaginator' })\n\nconst { config } = useConfig()\n\nconst props = withDefaults(defineProps<PaginatorProps>(), { total: 0 })\n\nconst emit = defineEmits<PaginatorEmits>()\n\nconst cls = bem('paginator')\n\nconst { size } = useFallbackProps([props], { size: 'default' as ComponentSize })\n\nconst pageNumber = defineModel<number>('pageNumber', { default: 1 })\n\nconst pageSize = defineModel<number>('pageSize', { default: 10 })\n\nfunction emitPageSize(value: number) {\n emit('change:pageSize', value)\n}\n\nfunction emitPageNumber(value: number) {\n emit('change:pageNumber', value)\n}\n\nconst handleChangePageSize = (size?: Record<string, any>) => {\n emitPageSize(size?.value)\n pageNumber.value = 1\n}\n\nfunction handleChangePageNumber(num: number) {\n if (props.pageNumber === num) return\n pageNumber.value = num\n emitPageNumber(pageNumber.value)\n}\n\nconst currentSize = computed(() => {\n return props.pageSize ?? config.paginator.pageSize\n})\n\n/** 完整页码 */\nconst totalPages = computed(() => {\n return Math.ceil(props.total / currentSize.value)\n})\n\nconst sizeOptions = computed(() => {\n return (props.pageSizeOptions ?? config.paginator.pageSizeOptions).map((value) => {\n return { label: `${value}条`, value }\n })\n})\n\n/** 做多显示5个页码 */\nconst pageNumbers = computed(() => {\n const startPageNum = n(pageNumber.value - 2).range(1, Math.max(totalPages.value - 4, 1))\n\n return Array.from({ length: Math.min(totalPages.value, 5) }).map(\n (_, index) => startPageNum + index\n )\n})\n\nconst preDisabled = computed(() => {\n return pageNumber.value <= 1\n})\nconst nextDisabled = computed(() => {\n return pageNumber.value >= totalPages.value\n})\n\nfunction handleJumpToFirst() {\n if (preDisabled.value) return\n pageNumber.value = 1\n emitPageNumber(pageNumber.value)\n}\nfunction handleJumpToLast() {\n if (nextDisabled.value) return\n pageNumber.value = totalPages.value\n emitPageNumber(pageNumber.value)\n}\nfunction handleJumpToPrev() {\n if (preDisabled.value) return\n pageNumber.value = pageNumber.value - 1\n emitPageNumber(pageNumber.value)\n}\nfunction handleJumpToNext() {\n if (nextDisabled.value) return\n\n pageNumber.value = pageNumber.value + 1\n emitPageNumber(pageNumber.value)\n}\n\nfunction handleKeyEnter(e: KeyboardEvent) {\n const target = e.target as HTMLInputElement\n const val = +target.value\n if (!isNaN(val) && val > 0 && val <= totalPages.value) {\n pageNumber.value = val\n emitPageNumber(pageNumber.value)\n }\n}\n\n/** 鼠标停留位置 */\nconst hovered = reactive({ first: false, last: false })\n\nconst paginatorRef = shallowRef<HTMLElement>()\n\ndefineExpose<_PaginatorExposed>({ el: paginatorRef })\n</script>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"palette-alpha.js","names":[],"sources":["../../../src/components/palette/palette-alpha.vue"],"sourcesContent":["<template>\n <div :class=\"cls.e('alpha')\" ref=\"alphaRef\">\n <div :class=\"cls.e('alpha-bg')\" :style=\"{ background: alphaSliderBG }\"></div>\n\n <span :class=\"cls.e('alpha-thumb')\" @click.stop :style=\"alphaThumbStyle\"></span>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useDrag } from '@veltra/compositions'\nimport { computed, inject, shallowRef, onMounted, watch } from 'vue'\n\nimport { PaletteDIKey } from './di'\n\ndefineOptions({ name: 'UPaletteAlpha' })\n\nconst { cls, updateAlpha, hueRGB, alpha, userAction, isUserActive } = inject(PaletteDIKey)!\n\nconst alphaRef = shallowRef<HTMLElement>()\n\nconst alphaThumbTransformX = shallowRef(0)\n\nconst alphaThumbStyle = computed(() => {\n return { transform: `translateX(${alphaThumbTransformX.value}px)` }\n})\n\nlet alphaWidth = 0\nconst rangeX = [0, 0] as [number, number]\n\nfunction getAlphaWidth() {\n alphaWidth = alphaRef.value?.offsetWidth ?? 0\n rangeX[1] = alphaWidth\n}\n\nconst updateOffsetX = userAction((offsetX: number) => {\n alphaThumbTransformX.value = offsetX\n updateAlpha(alphaWidth > 0 ? offsetX / alphaWidth : 0)\n})\n\nconst alphaDragger = useDrag({\n target: alphaRef,\n rangeX,\n onDrag({ offsetX }) {\n updateOffsetX(offsetX)\n },\n onDragStart(e) {\n getAlphaWidth()\n\n alphaDragger.update({ offsetX: e.offsetX })\n\n updateOffsetX(e.offsetX)\n }\n})\n\nconst alphaSliderBG = computed(() => {\n const { r, g, b } = hueRGB.value\n return `linear-gradient(to right, rgba(${r}, ${g}, ${b}, 0), rgba(${r}, ${g}, ${b}, 1))`\n})\n\nfunction init(): void {\n getAlphaWidth()\n alphaThumbTransformX.value = alphaWidth > 0 ? alphaWidth * alpha.value : 0\n}\n\nonMounted(() => {\n init()\n})\n\nwatch(\n alpha,\n (newAlphaValue) => {\n if (isUserActive()) return\n alphaThumbTransformX.value = alphaWidth > 0 ? alphaWidth * newAlphaValue : 0\n },\n { flush: 'post' }\n)\n\ndefineExpose({ init })\n</script>\n"],"mappings":";;;;;;;;EAgBA,MAAM,EAAE,KAAK,aAAa,QAAQ,OAAO,YAAY,iBAAiB,OAAO,YAAY;EAEzF,MAAM,WAAW,WAAwB;EAEzC,MAAM,uBAAuB,WAAW,CAAC;EAEzC,MAAM,kBAAkB,eAAe;GACrC,OAAO,EAAE,WAAW,cAAc,qBAAqB,MAAM,KAAK;EACpE,CAAC;EAED,IAAI,aAAa;EACjB,MAAM,SAAS,CAAC,GAAG,CAAC;EAEpB,SAAS,gBAAgB;GACvB,aAAa,SAAS,OAAO,eAAe;GAC5C,OAAO,KAAK;EACd;EAEA,MAAM,gBAAgB,YAAY,YAAoB;GACpD,qBAAqB,QAAQ;GAC7B,YAAY,aAAa,IAAI,UAAU,aAAa,CAAC;EACvD,CAAC;EAED,MAAM,eAAe,QAAQ;GAC3B,QAAQ;GACR;GACA,OAAO,EAAE,WAAW;IAClB,cAAc,OAAO;GACvB;GACA,YAAY,GAAG;IACb,cAAc;IAEd,aAAa,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC;IAE1C,cAAc,EAAE,OAAO;GACzB;EACF,CAAC;EAED,MAAM,gBAAgB,eAAe;GACnC,MAAM,EAAE,GAAG,GAAG,MAAM,OAAO;GAC3B,OAAO,kCAAkC,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE;EACpF,CAAC;EAED,SAAS,OAAa;GACpB,cAAc;GACd,qBAAqB,QAAQ,aAAa,IAAI,aAAa,MAAM,QAAQ;EAC3E;EAEA,gBAAgB;GACd,KAAK;EACP,CAAC;EAED,MACE,QACC,kBAAkB;GACjB,IAAI,aAAa,GAAG;GACpB,qBAAqB,QAAQ,aAAa,IAAI,aAAa,gBAAgB;EAC7E,GACA,EAAE,OAAO,OAAO,CAClB;EAEA,SAAa,EAAE,KAAK,CAAC;;GA5EnB,
|
|
1
|
+
{"version":3,"file":"palette-alpha.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_normalizeStyle","_withModifiers"],"sources":["../../../src/components/palette/palette-alpha.vue"],"sourcesContent":["<template>\n <div :class=\"cls.e('alpha')\" ref=\"alphaRef\">\n <div :class=\"cls.e('alpha-bg')\" :style=\"{ background: alphaSliderBG }\"></div>\n\n <span :class=\"cls.e('alpha-thumb')\" @click.stop :style=\"alphaThumbStyle\"></span>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useDrag } from '@veltra/compositions'\nimport { computed, inject, shallowRef, onMounted, watch } from 'vue'\n\nimport { PaletteDIKey } from './di'\n\ndefineOptions({ name: 'UPaletteAlpha' })\n\nconst { cls, updateAlpha, hueRGB, alpha, userAction, isUserActive } = inject(PaletteDIKey)!\n\nconst alphaRef = shallowRef<HTMLElement>()\n\nconst alphaThumbTransformX = shallowRef(0)\n\nconst alphaThumbStyle = computed(() => {\n return { transform: `translateX(${alphaThumbTransformX.value}px)` }\n})\n\nlet alphaWidth = 0\nconst rangeX = [0, 0] as [number, number]\n\nfunction getAlphaWidth() {\n alphaWidth = alphaRef.value?.offsetWidth ?? 0\n rangeX[1] = alphaWidth\n}\n\nconst updateOffsetX = userAction((offsetX: number) => {\n alphaThumbTransformX.value = offsetX\n updateAlpha(alphaWidth > 0 ? offsetX / alphaWidth : 0)\n})\n\nconst alphaDragger = useDrag({\n target: alphaRef,\n rangeX,\n onDrag({ offsetX }) {\n updateOffsetX(offsetX)\n },\n onDragStart(e) {\n getAlphaWidth()\n\n alphaDragger.update({ offsetX: e.offsetX })\n\n updateOffsetX(e.offsetX)\n }\n})\n\nconst alphaSliderBG = computed(() => {\n const { r, g, b } = hueRGB.value\n return `linear-gradient(to right, rgba(${r}, ${g}, ${b}, 0), rgba(${r}, ${g}, ${b}, 1))`\n})\n\nfunction init(): void {\n getAlphaWidth()\n alphaThumbTransformX.value = alphaWidth > 0 ? alphaWidth * alpha.value : 0\n}\n\nonMounted(() => {\n init()\n})\n\nwatch(\n alpha,\n (newAlphaValue) => {\n if (isUserActive()) return\n alphaThumbTransformX.value = alphaWidth > 0 ? alphaWidth * newAlphaValue : 0\n },\n { flush: 'post' }\n)\n\ndefineExpose({ init })\n</script>\n"],"mappings":";;;;;;;;EAgBA,MAAM,EAAE,KAAK,aAAa,QAAQ,OAAO,YAAY,iBAAiB,OAAO,YAAY;EAEzF,MAAM,WAAW,WAAwB;EAEzC,MAAM,uBAAuB,WAAW,CAAC;EAEzC,MAAM,kBAAkB,eAAe;GACrC,OAAO,EAAE,WAAW,cAAc,qBAAqB,MAAM,KAAK;EACpE,CAAC;EAED,IAAI,aAAa;EACjB,MAAM,SAAS,CAAC,GAAG,CAAC;EAEpB,SAAS,gBAAgB;GACvB,aAAa,SAAS,OAAO,eAAe;GAC5C,OAAO,KAAK;EACd;EAEA,MAAM,gBAAgB,YAAY,YAAoB;GACpD,qBAAqB,QAAQ;GAC7B,YAAY,aAAa,IAAI,UAAU,aAAa,CAAC;EACvD,CAAC;EAED,MAAM,eAAe,QAAQ;GAC3B,QAAQ;GACR;GACA,OAAO,EAAE,WAAW;IAClB,cAAc,OAAO;GACvB;GACA,YAAY,GAAG;IACb,cAAc;IAEd,aAAa,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC;IAE1C,cAAc,EAAE,OAAO;GACzB;EACF,CAAC;EAED,MAAM,gBAAgB,eAAe;GACnC,MAAM,EAAE,GAAG,GAAG,MAAM,OAAO;GAC3B,OAAO,kCAAkC,EAAE,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE;EACpF,CAAC;EAED,SAAS,OAAa;GACpB,cAAc;GACd,qBAAqB,QAAQ,aAAa,IAAI,aAAa,MAAM,QAAQ;EAC3E;EAEA,gBAAgB;GACd,KAAK;EACP,CAAC;EAED,MACE,QACC,kBAAkB;GACjB,IAAI,aAAa,GAAG;GACpB,qBAAqB,QAAQ,aAAa,IAAI,aAAa,gBAAgB;EAC7E,GACA,EAAE,OAAO,OAAO,CAClB;EAEA,SAAa,EAAE,KAAK,CAAC;;GA5EnB,OAAAA,UAAA,GAAAC,mBAIM,OAAA;IAJA,OAAKC,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,OAAA,CAAA;IAAe,SAAA;IAAJ,KAAI;GAC/B,GAAA,CAAAC,mBAA6E,OAAA;IAAvE,OAAKF,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,UAAA,CAAA;IAAe,OAAKE,eAAA,EAAA,YAAgB,cAAA,MAAa,CAAA;GAEnE,GAAA,MAAA,CAAA,GAAAD,mBAAgF,QAAA;IAAzE,OAAKF,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,aAAA,CAAA;IAAkB,SAAK,OAAA,OAAA,OAAA,KAAAG,oBAAN,CAAA,GAAW,CAAA,MAAA,CAAA;IAAE,OAAKD,eAAE,gBAAA,KAAe"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"palette-color-switch.js","names":[],"sources":["../../../src/components/palette/palette-color-switch.vue"],"sourcesContent":["<template>\n <div :class=\"cls.e('color-switch')\">\n <div :class=\"cls.e('color-type')\">HEX(A)</div>\n\n <u-input\n :class=\"cls.e('color-hexa')\"\n :clearable=\"false\"\n :model-value=\"color\"\n @change=\"handleUpdateColor\"\n :pattern=\"pattern\"\n />\n\n <u-button text type=\"primary\" :class=\"cls.e('clear-btn')\" @click=\"emit('clear')\">\n 清除\n </u-button>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { inject } from 'vue'\n\nimport { UButton } from '../button'\nimport { UInput } from '../input'\nimport { PaletteDIKey } from './di'\n\ndefineProps<{ color?: string }>()\n\nconst emit = defineEmits(['clear', 'update:color'])\n\nconst { cls } = inject(PaletteDIKey)!\n\nconst pattern = /^#([0-9a-fA-F]{3,4}){1,2}$/\n\nconst handleUpdateColor = (value: string) => {\n emit('update:color', value)\n}\n</script>\n"],"mappings":";;;;;;;;;;EA2BA,MAAM,OAAO;EAEb,MAAM,EAAE,QAAQ,OAAO,YAAY;EAEnC,MAAM,UAAU;EAEhB,MAAM,qBAAqB,UAAkB;GAC3C,KAAK,gBAAgB,KAAK;EAC5B;;GAlCE,
|
|
1
|
+
{"version":3,"file":"palette-color-switch.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_createVNode","UInput","UButton","_withCtx","_createTextVNode"],"sources":["../../../src/components/palette/palette-color-switch.vue"],"sourcesContent":["<template>\n <div :class=\"cls.e('color-switch')\">\n <div :class=\"cls.e('color-type')\">HEX(A)</div>\n\n <u-input\n :class=\"cls.e('color-hexa')\"\n :clearable=\"false\"\n :model-value=\"color\"\n @change=\"handleUpdateColor\"\n :pattern=\"pattern\"\n />\n\n <u-button text type=\"primary\" :class=\"cls.e('clear-btn')\" @click=\"emit('clear')\">\n 清除\n </u-button>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { inject } from 'vue'\n\nimport { UButton } from '../button'\nimport { UInput } from '../input'\nimport { PaletteDIKey } from './di'\n\ndefineProps<{ color?: string }>()\n\nconst emit = defineEmits(['clear', 'update:color'])\n\nconst { cls } = inject(PaletteDIKey)!\n\nconst pattern = /^#([0-9a-fA-F]{3,4}){1,2}$/\n\nconst handleUpdateColor = (value: string) => {\n emit('update:color', value)\n}\n</script>\n"],"mappings":";;;;;;;;;;EA2BA,MAAM,OAAO;EAEb,MAAM,EAAE,QAAQ,OAAO,YAAY;EAEnC,MAAM,UAAU;EAEhB,MAAM,qBAAqB,UAAkB;GAC3C,KAAK,gBAAgB,KAAK;EAC5B;;GAlCE,OAAAA,UAAA,GAAAC,mBAcM,OAAA,EAdA,OAAKC,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,cAAA,CAAA,EAAA,GAAA;IAChBC,mBAA8C,OAAA,EAAxC,OAAKF,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,YAAA,CAAA,EAAgB,GAAA,UAAM,CAAA;IAExCE,YAMEF,MAAAG,aAAA,GAAA;KALC,OAAKJ,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,YAAA,CAAA;KACZ,WAAW;KACX,eAAa,QAAA;KACb,UAAQ;KACC;;IAGZE,YAEWF,MAAAI,WAAA,GAAA;KAFD,MAAA;KAAK,MAAK;KAAW,OAAKL,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,WAAA,CAAA;KAAgB,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,OAAA;;KAAW,SAAAK,cAEjF,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAFiFC,gBAAA,QAEjF,EAAA,CAAA,EAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"palette-hue.js","names":[],"sources":["../../../src/components/palette/palette-hue.vue"],"sourcesContent":["<template>\n <div :class=\"cls.e('hue')\" ref=\"hueRef\">\n <span :class=\"cls.e('hue-thumb')\" @click.stop :style=\"hueThumbStyle\"></span>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useDrag } from '@veltra/compositions'\nimport { inject, onMounted } from 'vue'\nimport { shallowRef, computed } from 'vue'\n\nimport { PaletteDIKey } from './di'\n\ndefineOptions({ name: 'UPaletteHue' })\n\nconst { cls, updateHue, HSV, userAction } = inject(PaletteDIKey)!\n\nconst hueRef = shallowRef<HTMLElement>()\n\nconst transformX = shallowRef(0)\nlet sliderWidth = 0\n\nconst hueThumbStyle = computed(() => {\n return { transform: `translateX(${transformX.value}px)` }\n})\n\nconst rangeX = [0, 0] as [number, number]\n\nfunction getSliderWidth() {\n sliderWidth = hueRef.value?.offsetWidth ?? 0\n rangeX[1] = sliderWidth\n}\n\nconst updateOffsetX = userAction((offsetX: number) => {\n transformX.value = offsetX\n updateHue(Math.round((offsetX / sliderWidth) * 360))\n})\n\nconst sliderDragger = useDrag({\n target: hueRef,\n rangeX,\n onDrag({ offsetX }) {\n updateOffsetX(offsetX)\n },\n onDragStart(e) {\n getSliderWidth()\n\n sliderDragger.update({ offsetX: e.offsetX })\n\n updateOffsetX(e.offsetX)\n }\n})\n\nfunction init(): void {\n getSliderWidth()\n transformX.value = (sliderWidth * HSV.h) / 360\n}\n\nonMounted(() => {\n init()\n})\n\ndefineExpose({ init })\n</script>\n"],"mappings":";;;;;;;;EAeA,MAAM,EAAE,KAAK,WAAW,KAAK,eAAe,OAAO,YAAY;EAE/D,MAAM,SAAS,WAAwB;EAEvC,MAAM,aAAa,WAAW,CAAC;EAC/B,IAAI,cAAc;EAElB,MAAM,gBAAgB,eAAe;GACnC,OAAO,EAAE,WAAW,cAAc,WAAW,MAAM,KAAK;EAC1D,CAAC;EAED,MAAM,SAAS,CAAC,GAAG,CAAC;EAEpB,SAAS,iBAAiB;GACxB,cAAc,OAAO,OAAO,eAAe;GAC3C,OAAO,KAAK;EACd;EAEA,MAAM,gBAAgB,YAAY,YAAoB;GACpD,WAAW,QAAQ;GACnB,UAAU,KAAK,MAAO,UAAU,cAAe,GAAG,CAAC;EACrD,CAAC;EAED,MAAM,gBAAgB,QAAQ;GAC5B,QAAQ;GACR;GACA,OAAO,EAAE,WAAW;IAClB,cAAc,OAAO;GACvB;GACA,YAAY,GAAG;IACb,eAAe;IAEf,cAAc,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC;IAE3C,cAAc,EAAE,OAAO;GACzB;EACF,CAAC;EAED,SAAS,OAAa;GACpB,eAAe;GACf,WAAW,QAAS,cAAc,IAAI,IAAK;EAC7C;EAEA,gBAAgB;GACd,KAAK;EACP,CAAC;EAED,SAAa,EAAE,KAAK,CAAC;;GA7DnB,
|
|
1
|
+
{"version":3,"file":"palette-hue.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_withModifiers","_normalizeStyle"],"sources":["../../../src/components/palette/palette-hue.vue"],"sourcesContent":["<template>\n <div :class=\"cls.e('hue')\" ref=\"hueRef\">\n <span :class=\"cls.e('hue-thumb')\" @click.stop :style=\"hueThumbStyle\"></span>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useDrag } from '@veltra/compositions'\nimport { inject, onMounted } from 'vue'\nimport { shallowRef, computed } from 'vue'\n\nimport { PaletteDIKey } from './di'\n\ndefineOptions({ name: 'UPaletteHue' })\n\nconst { cls, updateHue, HSV, userAction } = inject(PaletteDIKey)!\n\nconst hueRef = shallowRef<HTMLElement>()\n\nconst transformX = shallowRef(0)\nlet sliderWidth = 0\n\nconst hueThumbStyle = computed(() => {\n return { transform: `translateX(${transformX.value}px)` }\n})\n\nconst rangeX = [0, 0] as [number, number]\n\nfunction getSliderWidth() {\n sliderWidth = hueRef.value?.offsetWidth ?? 0\n rangeX[1] = sliderWidth\n}\n\nconst updateOffsetX = userAction((offsetX: number) => {\n transformX.value = offsetX\n updateHue(Math.round((offsetX / sliderWidth) * 360))\n})\n\nconst sliderDragger = useDrag({\n target: hueRef,\n rangeX,\n onDrag({ offsetX }) {\n updateOffsetX(offsetX)\n },\n onDragStart(e) {\n getSliderWidth()\n\n sliderDragger.update({ offsetX: e.offsetX })\n\n updateOffsetX(e.offsetX)\n }\n})\n\nfunction init(): void {\n getSliderWidth()\n transformX.value = (sliderWidth * HSV.h) / 360\n}\n\nonMounted(() => {\n init()\n})\n\ndefineExpose({ init })\n</script>\n"],"mappings":";;;;;;;;EAeA,MAAM,EAAE,KAAK,WAAW,KAAK,eAAe,OAAO,YAAY;EAE/D,MAAM,SAAS,WAAwB;EAEvC,MAAM,aAAa,WAAW,CAAC;EAC/B,IAAI,cAAc;EAElB,MAAM,gBAAgB,eAAe;GACnC,OAAO,EAAE,WAAW,cAAc,WAAW,MAAM,KAAK;EAC1D,CAAC;EAED,MAAM,SAAS,CAAC,GAAG,CAAC;EAEpB,SAAS,iBAAiB;GACxB,cAAc,OAAO,OAAO,eAAe;GAC3C,OAAO,KAAK;EACd;EAEA,MAAM,gBAAgB,YAAY,YAAoB;GACpD,WAAW,QAAQ;GACnB,UAAU,KAAK,MAAO,UAAU,cAAe,GAAG,CAAC;EACrD,CAAC;EAED,MAAM,gBAAgB,QAAQ;GAC5B,QAAQ;GACR;GACA,OAAO,EAAE,WAAW;IAClB,cAAc,OAAO;GACvB;GACA,YAAY,GAAG;IACb,eAAe;IAEf,cAAc,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC;IAE3C,cAAc,EAAE,OAAO;GACzB;EACF,CAAC;EAED,SAAS,OAAa;GACpB,eAAe;GACf,WAAW,QAAS,cAAc,IAAI,IAAK;EAC7C;EAEA,gBAAgB;GACd,KAAK;EACP,CAAC;EAED,SAAa,EAAE,KAAK,CAAC;;GA7DnB,OAAAA,UAAA,GAAAC,mBAEM,OAAA;IAFA,OAAKC,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,KAAA,CAAA;IAAa,SAAA;IAAJ,KAAI;GAC7B,GAAA,CAAAC,mBAA4E,QAAA;IAArE,OAAKF,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,WAAA,CAAA;IAAgB,SAAK,OAAA,OAAA,OAAA,KAAAE,oBAAN,CAAA,GAAW,CAAA,MAAA,CAAA;IAAE,OAAKC,eAAE,cAAA,KAAa"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"palette-sv.js","names":[],"sources":["../../../src/components/palette/palette-sv.vue"],"sourcesContent":["<template>\n <!-- 调色画布 -->\n <div :class=\"cls.e('sv')\" ref=\"svRef\">\n <div :class=\"cls.e('sv-s')\" :style=\"{ backgroundImage: canvasBackground }\"></div>\n <div :class=\"cls.e('sv-v')\">{{}}</div>\n\n <div\n :class=\"cls.e('sv-thumb')\"\n ref=\"svThumbRef\"\n @click.stop\n @mousedown.stop\n :style=\"svThumbStyle\"\n ></div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useDrag } from '@veltra/compositions'\nimport { computed, inject, reactive, shallowRef, onMounted } from 'vue'\n\nimport { PaletteDIKey } from './di'\n\ndefineOptions({ name: 'UPaletteSV' })\n\nconst { cls, hueRGB, HSV, updateSV, userAction } = inject(PaletteDIKey)!\n\nconst svRef = shallowRef<HTMLDivElement>()\n\nconst canvasSize = { width: 0, height: 0 }\n\nconst rangeX = [0, 0] as [number, number]\nconst rangeY = [0, 0] as [number, number]\n\nconst getCanvasSize = () => {\n if (!svRef.value) return\n const { offsetHeight, offsetWidth } = svRef.value!\n\n canvasSize.width = offsetWidth\n rangeX[1] = offsetWidth\n\n canvasSize.height = offsetHeight\n rangeY[1] = offsetHeight\n}\n\nconst transform = reactive({ x: 0, y: 0 })\n\nconst svThumbStyle = computed(() => {\n return { transform: `translate(${transform.x}px, ${transform.y}px)` }\n})\n\nconst updateThumb = userAction((offsetX: number, offsetY: number) => {\n transform.x = offsetX\n transform.y = offsetY\n\n // 根据画布位置计算饱和度和亮度\n // 水平方向表示饱和度,从左到右饱和度逐渐增高\n // 垂直方向表示亮度,上亮下暗\n const s = Math.max(0, Math.min(1, offsetX / canvasSize.width))\n const v = Math.max(0, Math.min(1, 1 - offsetY / canvasSize.height))\n\n // 更新饱和度和亮度\n updateSV({ s, v })\n})\n\nconst svDragger = useDrag({\n target: svRef,\n rangeX,\n rangeY,\n\n onDrag({ offsetX, offsetY }) {\n updateThumb(offsetX, offsetY)\n },\n onDragStart(e) {\n getCanvasSize()\n\n const { offsetX, offsetY } = e\n\n updateThumb(offsetX, offsetY)\n\n svDragger.update({ offsetX, offsetY })\n }\n})\n\nconst canvasBackground = computed(() => {\n const { r, g, b } = hueRGB.value\n return `linear-gradient(to right, rgb(255, 255, 255), rgb(${r}, ${g}, ${b}))`\n})\n\nfunction init(): void {\n getCanvasSize()\n transform.x = canvasSize.width * HSV.s\n transform.y = canvasSize.height * (1 - HSV.v)\n}\n\nonMounted(() => {\n init()\n})\n\ndefineExpose({ init })\n</script>\n"],"mappings":";;;;;;;;EAwBA,MAAM,EAAE,KAAK,QAAQ,KAAK,UAAU,eAAe,OAAO,YAAY;EAEtE,MAAM,QAAQ,WAA2B;EAEzC,MAAM,aAAa;GAAE,OAAO;GAAG,QAAQ;EAAE;EAEzC,MAAM,SAAS,CAAC,GAAG,CAAC;EACpB,MAAM,SAAS,CAAC,GAAG,CAAC;EAEpB,MAAM,sBAAsB;GAC1B,IAAI,CAAC,MAAM,OAAO;GAClB,MAAM,EAAE,cAAc,gBAAgB,MAAM;GAE5C,WAAW,QAAQ;GACnB,OAAO,KAAK;GAEZ,WAAW,SAAS;GACpB,OAAO,KAAK;EACd;EAEA,MAAM,YAAY,SAAS;GAAE,GAAG;GAAG,GAAG;EAAE,CAAC;EAEzC,MAAM,eAAe,eAAe;GAClC,OAAO,EAAE,WAAW,aAAa,UAAU,EAAE,MAAM,UAAU,EAAE,KAAK;EACtE,CAAC;EAED,MAAM,cAAc,YAAY,SAAiB,YAAoB;GACnE,UAAU,IAAI;GACd,UAAU,IAAI;GAKd,MAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,UAAU,WAAW,KAAK,CAAC;GAC7D,MAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,IAAI,UAAU,WAAW,MAAM,CAAC;GAGlE,SAAS;IAAE;IAAG;GAAE,CAAC;EACnB,CAAC;EAED,MAAM,YAAY,QAAQ;GACxB,QAAQ;GACR;GACA;GAEA,OAAO,EAAE,SAAS,WAAW;IAC3B,YAAY,SAAS,OAAO;GAC9B;GACA,YAAY,GAAG;IACb,cAAc;IAEd,MAAM,EAAE,SAAS,YAAY;IAE7B,YAAY,SAAS,OAAO;IAE5B,UAAU,OAAO;KAAE;KAAS;IAAQ,CAAC;GACvC;EACF,CAAC;EAED,MAAM,mBAAmB,eAAe;GACtC,MAAM,EAAE,GAAG,GAAG,MAAM,OAAO;GAC3B,OAAO,qDAAqD,EAAE,IAAI,EAAE,IAAI,EAAE;EAC5E,CAAC;EAED,SAAS,OAAa;GACpB,cAAc;GACd,UAAU,IAAI,WAAW,QAAQ,IAAI;GACrC,UAAU,IAAI,WAAW,UAAU,IAAI,IAAI;EAC7C;EAEA,gBAAgB;GACd,KAAK;EACP,CAAC;EAED,SAAa,EAAE,KAAK,CAAC;;GAjGnB,OAAA,UAAA,GAAA,mBAAA,UAAA,MAAA,
|
|
1
|
+
{"version":3,"file":"palette-sv.js","names":["_openBlock","_createElementBlock","_Fragment","_createCommentVNode","_createElementVNode","_normalizeClass","_unref","_normalizeStyle","_toDisplayString","_withModifiers"],"sources":["../../../src/components/palette/palette-sv.vue"],"sourcesContent":["<template>\n <!-- 调色画布 -->\n <div :class=\"cls.e('sv')\" ref=\"svRef\">\n <div :class=\"cls.e('sv-s')\" :style=\"{ backgroundImage: canvasBackground }\"></div>\n <div :class=\"cls.e('sv-v')\">{{}}</div>\n\n <div\n :class=\"cls.e('sv-thumb')\"\n ref=\"svThumbRef\"\n @click.stop\n @mousedown.stop\n :style=\"svThumbStyle\"\n ></div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useDrag } from '@veltra/compositions'\nimport { computed, inject, reactive, shallowRef, onMounted } from 'vue'\n\nimport { PaletteDIKey } from './di'\n\ndefineOptions({ name: 'UPaletteSV' })\n\nconst { cls, hueRGB, HSV, updateSV, userAction } = inject(PaletteDIKey)!\n\nconst svRef = shallowRef<HTMLDivElement>()\n\nconst canvasSize = { width: 0, height: 0 }\n\nconst rangeX = [0, 0] as [number, number]\nconst rangeY = [0, 0] as [number, number]\n\nconst getCanvasSize = () => {\n if (!svRef.value) return\n const { offsetHeight, offsetWidth } = svRef.value!\n\n canvasSize.width = offsetWidth\n rangeX[1] = offsetWidth\n\n canvasSize.height = offsetHeight\n rangeY[1] = offsetHeight\n}\n\nconst transform = reactive({ x: 0, y: 0 })\n\nconst svThumbStyle = computed(() => {\n return { transform: `translate(${transform.x}px, ${transform.y}px)` }\n})\n\nconst updateThumb = userAction((offsetX: number, offsetY: number) => {\n transform.x = offsetX\n transform.y = offsetY\n\n // 根据画布位置计算饱和度和亮度\n // 水平方向表示饱和度,从左到右饱和度逐渐增高\n // 垂直方向表示亮度,上亮下暗\n const s = Math.max(0, Math.min(1, offsetX / canvasSize.width))\n const v = Math.max(0, Math.min(1, 1 - offsetY / canvasSize.height))\n\n // 更新饱和度和亮度\n updateSV({ s, v })\n})\n\nconst svDragger = useDrag({\n target: svRef,\n rangeX,\n rangeY,\n\n onDrag({ offsetX, offsetY }) {\n updateThumb(offsetX, offsetY)\n },\n onDragStart(e) {\n getCanvasSize()\n\n const { offsetX, offsetY } = e\n\n updateThumb(offsetX, offsetY)\n\n svDragger.update({ offsetX, offsetY })\n }\n})\n\nconst canvasBackground = computed(() => {\n const { r, g, b } = hueRGB.value\n return `linear-gradient(to right, rgb(255, 255, 255), rgb(${r}, ${g}, ${b}))`\n})\n\nfunction init(): void {\n getCanvasSize()\n transform.x = canvasSize.width * HSV.s\n transform.y = canvasSize.height * (1 - HSV.v)\n}\n\nonMounted(() => {\n init()\n})\n\ndefineExpose({ init })\n</script>\n"],"mappings":";;;;;;;;EAwBA,MAAM,EAAE,KAAK,QAAQ,KAAK,UAAU,eAAe,OAAO,YAAY;EAEtE,MAAM,QAAQ,WAA2B;EAEzC,MAAM,aAAa;GAAE,OAAO;GAAG,QAAQ;EAAE;EAEzC,MAAM,SAAS,CAAC,GAAG,CAAC;EACpB,MAAM,SAAS,CAAC,GAAG,CAAC;EAEpB,MAAM,sBAAsB;GAC1B,IAAI,CAAC,MAAM,OAAO;GAClB,MAAM,EAAE,cAAc,gBAAgB,MAAM;GAE5C,WAAW,QAAQ;GACnB,OAAO,KAAK;GAEZ,WAAW,SAAS;GACpB,OAAO,KAAK;EACd;EAEA,MAAM,YAAY,SAAS;GAAE,GAAG;GAAG,GAAG;EAAE,CAAC;EAEzC,MAAM,eAAe,eAAe;GAClC,OAAO,EAAE,WAAW,aAAa,UAAU,EAAE,MAAM,UAAU,EAAE,KAAK;EACtE,CAAC;EAED,MAAM,cAAc,YAAY,SAAiB,YAAoB;GACnE,UAAU,IAAI;GACd,UAAU,IAAI;GAKd,MAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,UAAU,WAAW,KAAK,CAAC;GAC7D,MAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,IAAI,UAAU,WAAW,MAAM,CAAC;GAGlE,SAAS;IAAE;IAAG;GAAE,CAAC;EACnB,CAAC;EAED,MAAM,YAAY,QAAQ;GACxB,QAAQ;GACR;GACA;GAEA,OAAO,EAAE,SAAS,WAAW;IAC3B,YAAY,SAAS,OAAO;GAC9B;GACA,YAAY,GAAG;IACb,cAAc;IAEd,MAAM,EAAE,SAAS,YAAY;IAE7B,YAAY,SAAS,OAAO;IAE5B,UAAU,OAAO;KAAE;KAAS;IAAQ,CAAC;GACvC;EACF,CAAC;EAED,MAAM,mBAAmB,eAAe;GACtC,MAAM,EAAE,GAAG,GAAG,MAAM,OAAO;GAC3B,OAAO,qDAAqD,EAAE,IAAI,EAAE,IAAI,EAAE;EAC5E,CAAC;EAED,SAAS,OAAa;GACpB,cAAc;GACd,UAAU,IAAI,WAAW,QAAQ,IAAI;GACrC,UAAU,IAAI,WAAW,UAAU,IAAI,IAAI;EAC7C;EAEA,gBAAgB;GACd,KAAK;EACP,CAAC;EAED,SAAa,EAAE,KAAK,CAAC;;GAjGnB,OAAA,UAAA,GAAA,mBAAA,UAAA,MAAA,CAAAG,mBAAA,QAAA,GACAC,mBAWM,OAAA;IAXA,OAAKC,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,IAAA,CAAA;IAAY,SAAA;IAAJ,KAAI;;IAC5BF,mBAAiF,OAAA;KAA3E,OAAKC,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA,CAAA;KAAW,OAAKC,eAAA,EAAA,iBAAqB,iBAAA,MAAgB,CAAA;;IACvEH,mBAAsC,OAAA,EAAhC,OAAKC,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,MAAA,CAAA,EAAA,GAAA,gBAAA,GAAA,CAAA;IAElBF,mBAMO,OAAA;KALJ,OAAKC,eAAEC,MAAA,GAAA,CAAG,CAAC,EAAC,UAAA,CAAA;KACb,KAAI;KACH,SAAK,OAAA,OAAA,OAAA,KAAAG,oBAAN,CAAA,GAAW,CAAA,MAAA,CAAA;KACV,aAAS,OAAA,OAAA,OAAA,KAAAA,oBAAV,CAAA,GAAe,CAAA,MAAA,CAAA;KACd,OAAKF,eAAE,aAAA,KAAY"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"palette.js","names":[],"sources":["../../../src/components/palette/palette.vue"],"sourcesContent":["<template>\n <u-tip\n trigger=\"click\"\n :class=\"cls.e('panel')\"\n v-model:visible=\"visible\"\n :disabled=\"disabled || readonly\"\n >\n <span :class=\"className\" :style=\"{ backgroundColor: color }\"> </span>\n\n <template #content>\n <!-- 饱和度和亮度 -->\n <PaletteSV ref=\"palette-sv\" />\n\n <!-- 色相 -->\n <PaletteHue ref=\"palette-hue\" />\n\n <!-- 透明度 -->\n <PaletteAlpha ref=\"palette-alpha\" />\n\n <!-- 颜色切换 -->\n <PaletteColorSwitch v-model:color=\"color\" @clear=\"handleClear\" />\n </template>\n </u-tip>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFormFallbackProps, useUserAction } from '@veltra/compositions'\nimport { bem } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed, provide, shallowRef, useTemplateRef, watch } from 'vue'\n\nimport type { PaletteProps } from '../../types'\nimport { UTip } from '../tip'\nimport { HSV2RGB, RGB2HEX, HEX2RGBA, RGB2HSV } from './color-transform'\nimport { PaletteDIKey } from './di'\nimport PaletteAlpha from './palette-alpha.vue'\nimport PaletteColorSwitch from './palette-color-switch.vue'\nimport PaletteHue from './palette-hue.vue'\nimport PaletteSV from './palette-sv.vue'\nimport { useHSV } from './use-hsv'\n\ndefineOptions({ name: 'UPalette' })\n\nconst props = withDefaults(defineProps<PaletteProps>(), {\n disabled: undefined,\n readonly: undefined\n})\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props])\n\nconst cls = bem('palette')\n\nconst className = computed(() => {\n return [cls.b, cls.m(size.value), bem.is('no-color', !color.value)]\n})\n\nconst { HSV, alpha, ...rest } = useHSV()\n\nconst color = defineModel<string>()\nconst RGB = computed(() => HSV2RGB(HSV))\nconst { userAction, isUserActive } = useUserAction()\n\nconst visible = shallowRef(false)\n\n/** 清除时跳过一次内部状态到 color 的同步,防止 updateAlpha 把已清空的 color 覆盖回来 */\nlet skipColorUpdate = false\n\nconst handleClear = userAction(() => {\n if (alpha.value !== 1) {\n skipColorUpdate = true\n }\n color.value = ''\n rest.updateAlpha(1)\n visible.value = false\n})\n\nwatch([alpha, RGB], ([alpha, RGB]) => {\n if (skipColorUpdate) {\n skipColorUpdate = false\n return\n }\n color.value = `#${RGB2HEX(RGB, alpha)}`\n})\n\nconst paletteSVRef = useTemplateRef('palette-sv')\nconst paletteHueRef = useTemplateRef('palette-hue')\nconst paletteAlphaRef = useTemplateRef('palette-alpha')\n\nwatch(\n color,\n (color) => {\n if (!color) return\n if (isUserActive()) return\n\n const parsed = HEX2RGBA(color)\n // 无法解析的颜色(如非法字符)视为未绑定,跳过同步,避免把 NaN 写回 modelValue\n if (!parsed) return\n\n const { RGB, alpha } = parsed\n const hsv = RGB2HSV(RGB)\n rest.updateHue(hsv.h)\n rest.updateSV({ s: hsv.s, v: hsv.v })\n rest.updateAlpha(alpha)\n\n paletteSVRef.value?.init()\n paletteHueRef.value?.init()\n paletteAlphaRef.value?.init()\n },\n { immediate: true }\n)\n\nprovide(PaletteDIKey, { cls, HSV, RGB, alpha, userAction, isUserActive, ...rest })\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2CA,MAAM,QAAQ;EAKd,MAAM,EAAE,cAAc,kBAAkB;EAExC,MAAM,EAAE,MAAM,UAAU,aAAa,qBAAqB,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC;EAElF,MAAM,MAAM,IAAI,SAAS;EAEzB,MAAM,YAAY,eAAe;GAC/B,OAAO;IAAC,IAAI;IAAG,IAAI,EAAE,KAAK,KAAK;IAAG,IAAI,GAAG,YAAY,CAAC,MAAM,KAAK;GAAC;EACpE,CAAC;EAED,MAAM,EAAE,KAAK,OAAO,GAAG,SAAS,OAAO;EAEvC,MAAM,
|
|
1
|
+
{"version":3,"file":"palette.js","names":["_useModel","_openBlock","_createBlock","_unref","UTip","_normalizeClass","_withCtx","_createCommentVNode","_createVNode","PaletteSV","PaletteHue","PaletteAlpha","PaletteColorSwitch","_createElementVNode","_normalizeStyle"],"sources":["../../../src/components/palette/palette.vue"],"sourcesContent":["<template>\n <u-tip\n trigger=\"click\"\n :class=\"cls.e('panel')\"\n v-model:visible=\"visible\"\n :disabled=\"disabled || readonly\"\n >\n <span :class=\"className\" :style=\"{ backgroundColor: color }\"> </span>\n\n <template #content>\n <!-- 饱和度和亮度 -->\n <PaletteSV ref=\"palette-sv\" />\n\n <!-- 色相 -->\n <PaletteHue ref=\"palette-hue\" />\n\n <!-- 透明度 -->\n <PaletteAlpha ref=\"palette-alpha\" />\n\n <!-- 颜色切换 -->\n <PaletteColorSwitch v-model:color=\"color\" @clear=\"handleClear\" />\n </template>\n </u-tip>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFormFallbackProps, useUserAction } from '@veltra/compositions'\nimport { bem } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed, provide, shallowRef, useTemplateRef, watch } from 'vue'\n\nimport type { PaletteProps } from '../../types'\nimport { UTip } from '../tip'\nimport { HSV2RGB, RGB2HEX, HEX2RGBA, RGB2HSV } from './color-transform'\nimport { PaletteDIKey } from './di'\nimport PaletteAlpha from './palette-alpha.vue'\nimport PaletteColorSwitch from './palette-color-switch.vue'\nimport PaletteHue from './palette-hue.vue'\nimport PaletteSV from './palette-sv.vue'\nimport { useHSV } from './use-hsv'\n\ndefineOptions({ name: 'UPalette' })\n\nconst props = withDefaults(defineProps<PaletteProps>(), {\n disabled: undefined,\n readonly: undefined\n})\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props])\n\nconst cls = bem('palette')\n\nconst className = computed(() => {\n return [cls.b, cls.m(size.value), bem.is('no-color', !color.value)]\n})\n\nconst { HSV, alpha, ...rest } = useHSV()\n\nconst color = defineModel<string>()\nconst RGB = computed(() => HSV2RGB(HSV))\nconst { userAction, isUserActive } = useUserAction()\n\nconst visible = shallowRef(false)\n\n/** 清除时跳过一次内部状态到 color 的同步,防止 updateAlpha 把已清空的 color 覆盖回来 */\nlet skipColorUpdate = false\n\nconst handleClear = userAction(() => {\n if (alpha.value !== 1) {\n skipColorUpdate = true\n }\n color.value = ''\n rest.updateAlpha(1)\n visible.value = false\n})\n\nwatch([alpha, RGB], ([alpha, RGB]) => {\n if (skipColorUpdate) {\n skipColorUpdate = false\n return\n }\n color.value = `#${RGB2HEX(RGB, alpha)}`\n})\n\nconst paletteSVRef = useTemplateRef('palette-sv')\nconst paletteHueRef = useTemplateRef('palette-hue')\nconst paletteAlphaRef = useTemplateRef('palette-alpha')\n\nwatch(\n color,\n (color) => {\n if (!color) return\n if (isUserActive()) return\n\n const parsed = HEX2RGBA(color)\n // 无法解析的颜色(如非法字符)视为未绑定,跳过同步,避免把 NaN 写回 modelValue\n if (!parsed) return\n\n const { RGB, alpha } = parsed\n const hsv = RGB2HSV(RGB)\n rest.updateHue(hsv.h)\n rest.updateSV({ s: hsv.s, v: hsv.v })\n rest.updateAlpha(alpha)\n\n paletteSVRef.value?.init()\n paletteHueRef.value?.init()\n paletteAlphaRef.value?.init()\n },\n { immediate: true }\n)\n\nprovide(PaletteDIKey, { cls, HSV, RGB, alpha, userAction, isUserActive, ...rest })\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2CA,MAAM,QAAQ;EAKd,MAAM,EAAE,cAAc,kBAAkB;EAExC,MAAM,EAAE,MAAM,UAAU,aAAa,qBAAqB,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC;EAElF,MAAM,MAAM,IAAI,SAAS;EAEzB,MAAM,YAAY,eAAe;GAC/B,OAAO;IAAC,IAAI;IAAG,IAAI,EAAE,KAAK,KAAK;IAAG,IAAI,GAAG,YAAY,CAAC,MAAM,KAAK;GAAC;EACpE,CAAC;EAED,MAAM,EAAE,KAAK,OAAO,GAAG,SAAS,OAAO;EAEvC,MAAM,QAAQA,SAAmB,SAAA,YAAC;EAClC,MAAM,MAAM,eAAe,QAAQ,GAAG,CAAC;EACvC,MAAM,EAAE,YAAY,iBAAiB,cAAc;EAEnD,MAAM,UAAU,WAAW,KAAK;;EAGhC,IAAI,kBAAkB;EAEtB,MAAM,cAAc,iBAAiB;GACnC,IAAI,MAAM,UAAU,GAClB,kBAAkB;GAEpB,MAAM,QAAQ;GACd,KAAK,YAAY,CAAC;GAClB,QAAQ,QAAQ;EAClB,CAAC;EAED,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,SAAS;GACpC,IAAI,iBAAiB;IACnB,kBAAkB;IAClB;GACF;GACA,MAAM,QAAQ,IAAI,QAAQ,KAAK,KAAK;EACtC,CAAC;EAED,MAAM,eAAe,eAAe,YAAY;EAChD,MAAM,gBAAgB,eAAe,aAAa;EAClD,MAAM,kBAAkB,eAAe,eAAe;EAEtD,MACE,QACC,UAAU;GACT,IAAI,CAAC,OAAO;GACZ,IAAI,aAAa,GAAG;GAEpB,MAAM,SAAS,SAAS,KAAK;GAE7B,IAAI,CAAC,QAAQ;GAEb,MAAM,EAAE,KAAK,UAAU;GACvB,MAAM,MAAM,QAAQ,GAAG;GACvB,KAAK,UAAU,IAAI,CAAC;GACpB,KAAK,SAAS;IAAE,GAAG,IAAI;IAAG,GAAG,IAAI;GAAE,CAAC;GACpC,KAAK,YAAY,KAAK;GAEtB,aAAa,OAAO,KAAK;GACzB,cAAc,OAAO,KAAK;GAC1B,gBAAgB,OAAO,KAAK;EAC9B,GACA,EAAE,WAAW,KAAK,CACpB;EAEA,QAAQ,cAAc;GAAE;GAAK;GAAK;GAAK;GAAO;GAAY;GAAc,GAAG;EAAK,CAAC;;GAhH/E,OAAAC,UAAA,GAAAC,YAqBQC,MAAAC,WAAA,GAAA;IApBN,SAAQ;IACP,OAAKC,eAAEF,MAAA,GAAA,CAAG,CAAC,EAAC,OAAA,CAAA;IACL,SAAS,QAAA;IAAA,oBAAA,OAAA,OAAA,OAAA,MAAA,WAAA,QAAO,QAAA;IACvB,UAAUA,MAAA,QAAA,KAAYA,MAAA,QAAA;;IAIZ,SAAOG,cACD;KAAfC,mBAAA,UAAA;KACAC,YAA8BC,aAAA,EAAnB,KAAI,aAAY,GAAA,MAAA,GAAA;KAE3BF,mBAAA,MAAA;KACAC,YAAgCE,aAAA,EAApB,KAAI,cAAa,GAAA,MAAA,GAAA;KAE7BH,mBAAA,OAAA;KACAC,YAAoCG,aAAA,EAAtB,KAAI,gBAAe,GAAA,MAAA,GAAA;KAEjCJ,mBAAA,QAAA;KACAC,YAAiEI,aAAA;MAArC,OAAO,MAAA;MAAA,kBAAA,OAAA,OAAA,OAAA,MAAA,WAAA,MAAK,QAAA;MAAG,SAAOT,MAAA,WAAA;;;IAbpD,SAAAG,cAAqE,CAArEO,mBAAqE,QAAA;KAA9D,OAAKR,eAAE,UAAA,KAAS;KAAG,OAAKS,eAAA,EAAA,iBAAqB,MAAA,MAAK,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"password-input.js","names":[],"sources":["../../../src/components/password-input/password-input.vue"],"sourcesContent":["<template>\n <u-input\n :class=\"cls.b\"\n :model-value=\"passwordText\"\n v-bind=\"inputProps\"\n :size=\"size\"\n :readonly=\"readonly\"\n :disabled=\"disabled\"\n :clearable=\"false\"\n @native:input=\"handleUpdatePwd\"\n @update:model-value=\"!$event && handleClear()\"\n @mouseenter=\"handleMouseEnter\"\n @mouseleave=\"handleMouseLeave\"\n >\n <template #suffix>\n <span :class=\"cls.e('suffix')\">\n <UIcon v-if=\"showClear\" :class=\"cls.e('clear')\" title=\"清除\" @click.stop=\"handleClear\">\n <Close />\n </UIcon>\n <UIcon :class=\"cls.e('visibility-toggle')\" :size=\"18\" @click.stop=\"toggleVisible\">\n <Hide v-if=\"pwdVisible\" />\n <View v-else />\n </UIcon>\n </span>\n </template>\n\n <template #prefix v-if=\"slots.prefix\">\n <slot name=\"prefix\" />\n </template>\n </u-input>\n</template>\n\n<script lang=\"ts\" setup>\nimport { o } from '@cat-kit/core'\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { Close, Hide, View } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed, nextTick, ref, shallowRef } from 'vue'\n\nimport type { PasswordInputProps } from '../../types'\nimport { UIcon } from '../icon'\nimport { UInput } from '../input'\n\ndefineOptions({ name: 'UPasswordInput' })\n\nconst props = withDefaults(defineProps<PasswordInputProps>(), {\n clearable: false,\n disabled: undefined,\n readonly: undefined\n})\n\nconst slots = defineSlots<{ prefix?: () => any }>()\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\nconst inputProps = computed(() => {\n return o(props).pick(['disabled', 'placeholder', 'size'])\n})\n\nconst cls = bem('password-input')\n\nconst model = defineModel<string>()\n\nconst hovered = ref(false)\n\nconst handleMouseEnter = (): void => {\n hovered.value = true\n}\n\nconst handleMouseLeave = (): void => {\n hovered.value = false\n}\n\nconst showClear = computed(() => {\n return props.clearable && !disabled.value && !!model.value && hovered.value\n})\n\nconst passwordChar = '●'\n\nconst handleUpdatePwd = (e: Event): void => {\n const target = e.target as HTMLInputElement\n const val = target.value\n if (!val) {\n model.value = val\n return\n }\n\n // 字符从无到有\n if (!model.value) {\n model.value = val\n return\n }\n\n const pointIndex = target.selectionStart!\n let inputChar = pointIndex === 0 ? '' : val[pointIndex - 1]!\n if (inputChar === passwordChar) inputChar = ''\n\n // 光标右侧字符数量(当前字符长度减去光标位置)\n const rightLen = val.length - pointIndex\n // 光标左侧字符数量 (当光标前的字符是刚刚输入的,则为这个字符前的所有的字符,否则为光标前的所有赐福)\n const leftLen = inputChar === '' ? pointIndex : pointIndex - 1\n\n const leftVal = model.value.slice(0, leftLen)\n const rightVal = rightLen === 0 ? '' : model.value.slice(-rightLen)\n\n model.value = leftVal + inputChar + rightVal\n\n nextTick(() => {\n target.selectionStart = pointIndex\n target.selectionEnd = pointIndex\n })\n}\n\nconst handleClear = (): void => {\n model.value = ''\n}\n\nconst pwdVisible = shallowRef(false)\n\nconst passwordText = computed<string | undefined>(() => {\n if (pwdVisible.value) return model.value\n return model.value ? passwordChar.repeat(model.value.length) : ''\n})\n\nconst toggleVisible = () => {\n pwdVisible.value = !pwdVisible.value\n}\n</script>\n"],"mappings":";;;;;;;;AAoFA,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAtCrB,MAAM,QAAQ;EAMd,MAAM,
|
|
1
|
+
{"version":3,"file":"password-input.js","names":["_useSlots","_useModel","_openBlock","_createBlock","_unref","UInput","_mergeProps","_createSlots","_withCtx","_createElementVNode","_normalizeClass","UIcon","_withModifiers","_createVNode","_createCommentVNode","_renderSlot"],"sources":["../../../src/components/password-input/password-input.vue"],"sourcesContent":["<template>\n <u-input\n :class=\"cls.b\"\n :model-value=\"passwordText\"\n v-bind=\"inputProps\"\n :size=\"size\"\n :readonly=\"readonly\"\n :disabled=\"disabled\"\n :clearable=\"false\"\n @native:input=\"handleUpdatePwd\"\n @update:model-value=\"!$event && handleClear()\"\n @mouseenter=\"handleMouseEnter\"\n @mouseleave=\"handleMouseLeave\"\n >\n <template #suffix>\n <span :class=\"cls.e('suffix')\">\n <UIcon v-if=\"showClear\" :class=\"cls.e('clear')\" title=\"清除\" @click.stop=\"handleClear\">\n <Close />\n </UIcon>\n <UIcon :class=\"cls.e('visibility-toggle')\" :size=\"18\" @click.stop=\"toggleVisible\">\n <Hide v-if=\"pwdVisible\" />\n <View v-else />\n </UIcon>\n </span>\n </template>\n\n <template #prefix v-if=\"slots.prefix\">\n <slot name=\"prefix\" />\n </template>\n </u-input>\n</template>\n\n<script lang=\"ts\" setup>\nimport { o } from '@cat-kit/core'\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { Close, Hide, View } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { injectFormContext } from '@veltra/utils'\nimport { computed, nextTick, ref, shallowRef } from 'vue'\n\nimport type { PasswordInputProps } from '../../types'\nimport { UIcon } from '../icon'\nimport { UInput } from '../input'\n\ndefineOptions({ name: 'UPasswordInput' })\n\nconst props = withDefaults(defineProps<PasswordInputProps>(), {\n clearable: false,\n disabled: undefined,\n readonly: undefined\n})\n\nconst slots = defineSlots<{ prefix?: () => any }>()\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\nconst inputProps = computed(() => {\n return o(props).pick(['disabled', 'placeholder', 'size'])\n})\n\nconst cls = bem('password-input')\n\nconst model = defineModel<string>()\n\nconst hovered = ref(false)\n\nconst handleMouseEnter = (): void => {\n hovered.value = true\n}\n\nconst handleMouseLeave = (): void => {\n hovered.value = false\n}\n\nconst showClear = computed(() => {\n return props.clearable && !disabled.value && !!model.value && hovered.value\n})\n\nconst passwordChar = '●'\n\nconst handleUpdatePwd = (e: Event): void => {\n const target = e.target as HTMLInputElement\n const val = target.value\n if (!val) {\n model.value = val\n return\n }\n\n // 字符从无到有\n if (!model.value) {\n model.value = val\n return\n }\n\n const pointIndex = target.selectionStart!\n let inputChar = pointIndex === 0 ? '' : val[pointIndex - 1]!\n if (inputChar === passwordChar) inputChar = ''\n\n // 光标右侧字符数量(当前字符长度减去光标位置)\n const rightLen = val.length - pointIndex\n // 光标左侧字符数量 (当光标前的字符是刚刚输入的,则为这个字符前的所有的字符,否则为光标前的所有赐福)\n const leftLen = inputChar === '' ? pointIndex : pointIndex - 1\n\n const leftVal = model.value.slice(0, leftLen)\n const rightVal = rightLen === 0 ? '' : model.value.slice(-rightLen)\n\n model.value = leftVal + inputChar + rightVal\n\n nextTick(() => {\n target.selectionStart = pointIndex\n target.selectionEnd = pointIndex\n })\n}\n\nconst handleClear = (): void => {\n model.value = ''\n}\n\nconst pwdVisible = shallowRef(false)\n\nconst passwordText = computed<string | undefined>(() => {\n if (pwdVisible.value) return model.value\n return model.value ? passwordChar.repeat(model.value.length) : ''\n})\n\nconst toggleVisible = () => {\n pwdVisible.value = !pwdVisible.value\n}\n</script>\n"],"mappings":"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"}
|