@veltra/desktop 1.1.0 → 1.1.2
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.vue.d.ts +2 -2
- package/dist/components/action/action.vue.d.ts +1 -1
- package/dist/components/auto-complete/auto-complete.js +3 -2
- package/dist/components/auto-complete/auto-complete.js.map +1 -1
- package/dist/components/auto-complete/style2.css +2 -2
- package/dist/components/button/button.vue.d.ts +1 -1
- package/dist/components/cascade/cascade.js +3 -2
- package/dist/components/cascade/cascade.js.map +1 -1
- package/dist/components/cascade/cascade.vue.d.ts +3 -3
- package/dist/components/cascade/style2.css +1 -1
- package/dist/components/checkbox/checkbox-button.js +3 -2
- package/dist/components/checkbox/checkbox-button.js.map +1 -1
- package/dist/components/checkbox/checkbox.js +3 -2
- package/dist/components/checkbox/checkbox.js.map +1 -1
- package/dist/components/checkbox/style2.css +2 -2
- package/dist/components/checkbox-group/checkbox-group.js +3 -2
- package/dist/components/checkbox-group/checkbox-group.js.map +1 -1
- package/dist/components/code-editor/code-editor.js +3 -2
- package/dist/components/code-editor/code-editor.js.map +1 -1
- package/dist/components/code-editor/style2.css +1 -1
- package/dist/components/collapse/collapse-item.js +10 -35
- package/dist/components/collapse/collapse-item.js.map +1 -1
- package/dist/components/collapse/collapse.js +4 -2
- package/dist/components/collapse/collapse.js.map +1 -1
- package/dist/components/collapse/collapse.vue.d.ts +1 -1
- package/dist/components/collapse/di.js +1 -0
- package/dist/components/collapse/di.js.map +1 -1
- package/dist/components/date-panel/date-panel.vue.d.ts +1 -1
- package/dist/components/date-picker/date-picker.js +3 -2
- package/dist/components/date-picker/date-picker.js.map +1 -1
- package/dist/components/date-range-picker/date-range-picker.js +3 -2
- package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
- package/dist/components/date-range-picker/style2.css +1 -1
- package/dist/components/expression-editor/expression-editor.js +3 -2
- package/dist/components/expression-editor/expression-editor.js.map +1 -1
- package/dist/components/expression-editor/style2.css +5 -5
- package/dist/components/form/form.js.map +1 -1
- package/dist/components/form/form.vue_vue_type_script_setup_true_lang.js +2 -2
- 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 +3 -2
- package/dist/components/form-item/form-item.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/form-item/style2.css +0 -1
- package/dist/components/grid-input/style2.css +3 -3
- package/dist/components/group-input/group-input.js +3 -2
- package/dist/components/group-input/group-input.js.map +1 -1
- package/dist/components/input/input.js.map +1 -1
- package/dist/components/input/input.vue.d.ts +2 -2
- package/dist/components/input/input.vue_vue_type_script_setup_true_lang.js +3 -2
- package/dist/components/input/input.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/input/style2.css +1 -1
- package/dist/components/menu/di.js +1 -0
- package/dist/components/menu/di.js.map +1 -1
- package/dist/components/menu/menu-sub.js +7 -15
- package/dist/components/menu/menu-sub.js.map +1 -1
- package/dist/components/menu/menu.js +8 -2
- package/dist/components/menu/menu.js.map +1 -1
- package/dist/components/multi-select/multi-select.js +3 -2
- package/dist/components/multi-select/multi-select.js.map +1 -1
- package/dist/components/multi-select/style2.css +2 -2
- package/dist/components/multi-tree-select/multi-tree-select.js +3 -2
- package/dist/components/multi-tree-select/multi-tree-select.js.map +1 -1
- package/dist/components/multi-tree-select/multi-tree-select.vue.d.ts +2 -2
- package/dist/components/multi-tree-select/style2.css +2 -2
- package/dist/components/notification/notification.vue.d.ts +1 -1
- package/dist/components/number-input/number-input.js +3 -2
- package/dist/components/number-input/number-input.js.map +1 -1
- package/dist/components/number-input/number-input.vue.d.ts +2 -2
- package/dist/components/number-range-input/number-range-input.js +3 -2
- package/dist/components/number-range-input/number-range-input.js.map +1 -1
- package/dist/components/palette/palette.js +3 -2
- package/dist/components/palette/palette.js.map +1 -1
- package/dist/components/password-input/password-input.js +4 -3
- package/dist/components/password-input/password-input.js.map +1 -1
- package/dist/components/pop-confirm/pop-confirm.js +3 -2
- package/dist/components/pop-confirm/pop-confirm.js.map +1 -1
- package/dist/components/pop-confirm/pop-confirm.vue.d.ts +1 -1
- package/dist/components/radio/radio.js +3 -2
- package/dist/components/radio/radio.js.map +1 -1
- package/dist/components/radio/style2.css +1 -1
- package/dist/components/radio-group/radio-group.js +3 -2
- package/dist/components/radio-group/radio-group.js.map +1 -1
- package/dist/components/radio-group/style2.css +1 -1
- package/dist/components/rich-text-editor/rich-text-editor.js +3 -2
- package/dist/components/rich-text-editor/rich-text-editor.js.map +1 -1
- package/dist/components/rich-text-editor/style2.css +5 -5
- package/dist/components/select/select.js +4 -3
- package/dist/components/select/select.js.map +1 -1
- package/dist/components/slider/slider.js +3 -2
- package/dist/components/slider/slider.js.map +1 -1
- package/dist/components/switch/style2.css +1 -1
- package/dist/components/switch/switch.js +3 -2
- package/dist/components/switch/switch.js.map +1 -1
- package/dist/components/tabs/tabs-horizontal.vue.d.ts +3 -3
- package/dist/components/tabs/tabs-vertical.vue.d.ts +2 -2
- package/dist/components/tabs/tabs.vue.d.ts +3 -3
- package/dist/components/tag/tag.js +3 -2
- package/dist/components/tag/tag.js.map +1 -1
- package/dist/components/textarea/style2.css +1 -1
- package/dist/components/textarea/textarea.js +3 -2
- package/dist/components/textarea/textarea.js.map +1 -1
- package/dist/components/textarea/textarea.vue.d.ts +2 -2
- package/dist/components/tip/tip.vue.d.ts +1 -1
- package/dist/components/tree/tree.js +3 -2
- package/dist/components/tree/tree.js.map +1 -1
- package/dist/components/tree-select/tree-select.js +3 -2
- package/dist/components/tree-select/tree-select.js.map +1 -1
- package/dist/components/tree-select/tree-select.vue.d.ts +2 -2
- package/dist/utils/form-context.js +17 -0
- package/dist/utils/form-context.js.map +1 -0
- package/package.json +11 -11
- package/src/components/auto-complete/auto-complete.vue +3 -2
- package/src/components/auto-complete/style.scss +2 -2
- package/src/components/cascade/cascade.vue +3 -2
- package/src/components/cascade/style.scss +1 -1
- package/src/components/checkbox/checkbox-button.vue +3 -2
- package/src/components/checkbox/checkbox.vue +3 -2
- package/src/components/checkbox/style.scss +2 -2
- package/src/components/checkbox-group/checkbox-group.vue +3 -2
- package/src/components/code-editor/code-editor.vue +3 -2
- package/src/components/code-editor/style.scss +1 -1
- package/src/components/collapse/collapse-item.vue +11 -49
- package/src/components/collapse/collapse.vue +7 -2
- package/src/components/collapse/di.ts +2 -1
- package/src/components/collapse/style.scss +1 -1
- package/src/components/date-picker/date-picker.vue +3 -2
- package/src/components/date-range-picker/date-range-picker.vue +3 -2
- package/src/components/date-range-picker/style.scss +1 -1
- package/src/components/expression-editor/expression-editor.vue +3 -2
- package/src/components/expression-editor/style.scss +5 -5
- package/src/components/form/form.vue +2 -2
- package/src/components/form-item/form-item.vue +3 -2
- package/src/components/form-item/style.scss +0 -1
- package/src/components/grid-input/style.scss +1 -1
- package/src/components/group-input/group-input.vue +3 -2
- package/src/components/input/input.vue +3 -2
- package/src/components/input/style.scss +1 -1
- package/src/components/menu/di.ts +2 -1
- package/src/components/menu/menu-sub.vue +6 -9
- package/src/components/menu/menu.vue +11 -2
- package/src/components/multi-select/multi-select.vue +3 -2
- package/src/components/multi-select/style.scss +2 -2
- package/src/components/multi-tree-select/multi-tree-select.vue +3 -2
- package/src/components/multi-tree-select/style.scss +2 -2
- package/src/components/number-input/number-input.vue +3 -2
- package/src/components/number-range-input/number-range-input.vue +3 -2
- package/src/components/palette/palette.vue +3 -2
- package/src/components/password-input/password-input.vue +4 -3
- package/src/components/pop-confirm/pop-confirm.vue +3 -2
- package/src/components/radio/radio.vue +3 -2
- package/src/components/radio/style.scss +1 -1
- package/src/components/radio-group/radio-group.vue +3 -2
- package/src/components/radio-group/style.scss +1 -1
- package/src/components/rich-text-editor/rich-text-editor.vue +3 -2
- package/src/components/rich-text-editor/style.scss +5 -5
- package/src/components/select/select.vue +4 -3
- package/src/components/slider/slider.vue +3 -2
- package/src/components/switch/style.scss +1 -1
- package/src/components/switch/switch.vue +3 -2
- package/src/components/tag/tag.vue +3 -2
- package/src/components/textarea/style.scss +1 -1
- package/src/components/textarea/textarea.vue +3 -2
- package/src/components/tree/tree.vue +3 -2
- package/src/components/tree-select/tree-select.vue +3 -2
- package/src/utils/form-context.ts +24 -0
- package/dist/components/menu/use-menu-transition.js +0 -71
- package/dist/components/menu/use-menu-transition.js.map +0 -1
- package/src/components/menu/use-menu-transition.ts +0 -69
|
@@ -16,12 +16,12 @@ type __VLS_Slots = {
|
|
|
16
16
|
default?: () => VNode[];
|
|
17
17
|
};
|
|
18
18
|
declare const __VLS_base: _$vue.DefineComponent<_Props, {}, {}, {}, {}, _$vue.ComponentOptionsMixin, _$vue.ComponentOptionsMixin, {}, string, _$vue.PublicProps, Readonly<_Props> & Readonly<{}>, {
|
|
19
|
-
type: ColorType;
|
|
20
19
|
size: "small" | "default" | "large";
|
|
20
|
+
type: ColorType;
|
|
21
21
|
hover: boolean;
|
|
22
22
|
circle: boolean;
|
|
23
|
-
max: number;
|
|
24
23
|
text: boolean;
|
|
24
|
+
max: number;
|
|
25
25
|
loading: boolean;
|
|
26
26
|
}, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
|
|
27
27
|
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
@@ -15,8 +15,8 @@ declare const __VLS_base: _$vue.DefineComponent<ActionProps, {}, {}, {}, {}, _$v
|
|
|
15
15
|
}, string, _$vue.PublicProps, Readonly<ActionProps> & Readonly<{
|
|
16
16
|
onRun?: (() => any) | undefined;
|
|
17
17
|
}>, {
|
|
18
|
-
type: ButtonType;
|
|
19
18
|
size: _$_veltra_utils0.ComponentSize;
|
|
19
|
+
type: ButtonType;
|
|
20
20
|
circle: boolean;
|
|
21
21
|
text: boolean;
|
|
22
22
|
loading: boolean;
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import _sfc_main$1 from "../scroll/scroll.js";
|
|
2
|
+
import { injectFormContext } from "../../utils/form-context.js";
|
|
2
3
|
import _sfc_main$2 from "../dropdown/dropdown.js";
|
|
3
4
|
import input_default from "../input/input.js";
|
|
4
5
|
import { useKeyboard } from "./use-keyboard.js";
|
|
5
6
|
import { useSuggestions } from "./use-suggestions.js";
|
|
6
7
|
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createSlots, createTextVNode, createVNode, defineComponent, guardReactiveProps, mergeModels, mergeProps, normalizeClass, normalizeProps, openBlock, renderList, renderSlot, shallowRef, toDisplayString, unref, useModel, useSlots, watch, withCtx, withDirectives } from "vue";
|
|
7
8
|
import { FORM_EMPTY_CONTENT, bem, scrollIntoContainerView } from "@veltra/utils";
|
|
8
|
-
import {
|
|
9
|
+
import { useFormFallbackProps } from "@veltra/compositions";
|
|
9
10
|
import { vRipple } from "@veltra/directives";
|
|
10
11
|
//#region src/components/auto-complete/auto-complete.vue
|
|
11
12
|
const _hoisted_1 = ["data-key"];
|
|
@@ -47,7 +48,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
47
48
|
const model = useModel(__props, "modelValue");
|
|
48
49
|
const cls = bem("auto-complete");
|
|
49
50
|
const optionClass = cls.e("option");
|
|
50
|
-
const { formProps } =
|
|
51
|
+
const { formProps } = injectFormContext();
|
|
51
52
|
const { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {
|
|
52
53
|
size: "default",
|
|
53
54
|
disabled: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-complete.js","names":[],"sources":["../../../src/components/auto-complete/auto-complete.vue"],"sourcesContent":["<template>\n <u-dropdown\n v-if=\"!readonly\"\n trigger=\"click\"\n :class=\"[cls.b, cls.m(size), bem.is('disabled', disabled)]\"\n ref=\"dropdownRef\"\n v-model:visible=\"dropdownVisible\"\n :content-class=\"[cls.e('panel'), cls.em('panel', size)]\"\n :disabled=\"disabled\"\n >\n <!-- 触发 -->\n <template #trigger>\n <!-- 单选 -->\n <u-input\n :size=\"size\"\n :disabled=\"disabled\"\n :placeholder=\"placeholder\"\n :clearable=\"clearable\"\n v-model=\"model\"\n @keydown=\"handleInputKeydown\"\n >\n <template #suffix v-if=\"slots.suffix\">\n <slot name=\"suffix\" />\n </template>\n\n <template #prefix v-if=\"slots.prefix\">\n <slot name=\"prefix\" />\n </template>\n </u-input>\n </template>\n\n <!-- 下拉内容 -->\n <template #content>\n <u-scroll tag=\"ul\" :class=\"cls.e('options')\" ref=\"scrollRef\">\n <li\n v-if=\"cachedSuggestion\"\n :class=\"[optionClass, bem.is('active', isCachedActive)]\"\n @click=\"handleSelectCachedOption(cachedSuggestion)\"\n v-ripple=\"cls.e('ripple')\"\n :data-key=\"cachedSuggestion\"\n :key=\"cachedSuggestion\"\n >\n <slot v-bind=\"{ option: cachedSuggestion, index: -1 }\">\n {{ cachedSuggestion }}\n </slot>\n </li>\n\n <li\n v-for=\"(option, index) of suggestions\"\n :class=\"[\n optionClass,\n bem.is('selected', option === model),\n bem.is('active', isActiveOption(index))\n ]\"\n @click=\"handleSelect(option)\"\n v-ripple=\"cls.e('ripple')\"\n :data-key=\"option\"\n :key=\"option\"\n >\n <slot v-bind=\"{ option, index }\">\n {{ option }}\n </slot>\n </li>\n </u-scroll>\n </template>\n </u-dropdown>\n\n <template v-else>\n {{ model || FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport {
|
|
1
|
+
{"version":3,"file":"auto-complete.js","names":[],"sources":["../../../src/components/auto-complete/auto-complete.vue"],"sourcesContent":["<template>\n <u-dropdown\n v-if=\"!readonly\"\n trigger=\"click\"\n :class=\"[cls.b, cls.m(size), bem.is('disabled', disabled)]\"\n ref=\"dropdownRef\"\n v-model:visible=\"dropdownVisible\"\n :content-class=\"[cls.e('panel'), cls.em('panel', size)]\"\n :disabled=\"disabled\"\n >\n <!-- 触发 -->\n <template #trigger>\n <!-- 单选 -->\n <u-input\n :size=\"size\"\n :disabled=\"disabled\"\n :placeholder=\"placeholder\"\n :clearable=\"clearable\"\n v-model=\"model\"\n @keydown=\"handleInputKeydown\"\n >\n <template #suffix v-if=\"slots.suffix\">\n <slot name=\"suffix\" />\n </template>\n\n <template #prefix v-if=\"slots.prefix\">\n <slot name=\"prefix\" />\n </template>\n </u-input>\n </template>\n\n <!-- 下拉内容 -->\n <template #content>\n <u-scroll tag=\"ul\" :class=\"cls.e('options')\" ref=\"scrollRef\">\n <li\n v-if=\"cachedSuggestion\"\n :class=\"[optionClass, bem.is('active', isCachedActive)]\"\n @click=\"handleSelectCachedOption(cachedSuggestion)\"\n v-ripple=\"cls.e('ripple')\"\n :data-key=\"cachedSuggestion\"\n :key=\"cachedSuggestion\"\n >\n <slot v-bind=\"{ option: cachedSuggestion, index: -1 }\">\n {{ cachedSuggestion }}\n </slot>\n </li>\n\n <li\n v-for=\"(option, index) of suggestions\"\n :class=\"[\n optionClass,\n bem.is('selected', option === model),\n bem.is('active', isActiveOption(index))\n ]\"\n @click=\"handleSelect(option)\"\n v-ripple=\"cls.e('ripple')\"\n :data-key=\"option\"\n :key=\"option\"\n >\n <slot v-bind=\"{ option, index }\">\n {{ option }}\n </slot>\n </li>\n </u-scroll>\n </template>\n </u-dropdown>\n\n <template v-else>\n {{ model || FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { vRipple } from '@veltra/directives'\nimport { bem, FORM_EMPTY_CONTENT, scrollIntoContainerView } from '@veltra/utils'\nimport { computed, shallowRef, watch } from 'vue'\n\nimport type { AutoCompleteEmits, AutoCompleteProps, _AutoCompleteExposed } from '../../types'\nimport type { DropdownExposed, ScrollExposed } from '../../types'\nimport { injectFormContext } from '../../utils/form-context'\nimport { UDropdown } from '../dropdown'\nimport { UInput } from '../input'\nimport { UScroll } from '../scroll'\nimport { useKeyboard } from './use-keyboard'\nimport { useSuggestions } from './use-suggestions'\n\ndefineOptions({ name: 'AutoComplete', inheritAttrs: false })\n\nconst props = withDefaults(defineProps<AutoCompleteProps>(), {\n placeholder: '请输入',\n clearable: true,\n disabled: undefined,\n readonly: undefined\n})\n\nconst emit = defineEmits<AutoCompleteEmits>()\n\nconst slots = defineSlots<{\n default?: (props: { option: string; index: number }) => any\n suffix?: () => any\n prefix?: () => any\n}>()\n\n// 当前输入框的值\nconst model = defineModel<string>()\n\nconst cls = bem('auto-complete')\n\nconst optionClass = cls.e('option')\n\nconst { formProps } = injectFormContext()\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\nconst dropdownRef = shallowRef<DropdownExposed>()\nconst dropdownVisible = shallowRef(false)\nconst scrollRef = shallowRef<ScrollExposed>()\n\nwatch(scrollRef, (scroll) => {\n if (scroll && model.value !== undefined) {\n const li = scroll.contentRef!.querySelector(`li[data-key=\"${model.value}\"]`) as HTMLElement\n li && scrollIntoContainerView(li, scroll.containerRef ?? null)\n }\n})\n\nconst { suggestions, appendedSuggestions, cachedSuggestion } = useSuggestions({ props, model })\n\nconst keyboardOptions = computed(() => {\n const currentSuggestions = suggestions.value\n return cachedSuggestion.value\n ? [cachedSuggestion.value, ...currentSuggestions]\n : currentSuggestions\n})\n\nconst { point, handleKeydown } = useKeyboard({\n options: keyboardOptions,\n dropdownVisible,\n getDefaultIndex: (options) => {\n if (!options.length) return -1\n if (model.value) {\n const matchIndex = options.indexOf(model.value)\n if (matchIndex > -1) return matchIndex\n }\n return 0\n },\n onSelect: (option, index) => {\n if (cachedSuggestion.value && index === 0) {\n handleSelectCachedOption(option)\n return\n }\n handleSelect(option)\n }\n})\n\nconst isCachedActive = computed(() => !!cachedSuggestion.value && point.value === 0)\n\nconst isActiveOption = (index: number) => {\n const offset = cachedSuggestion.value ? 1 : 0\n return point.value === index + offset\n}\n\nconst handleInputKeydown = (event: KeyboardEvent) => {\n if (!dropdownVisible.value && event.key === 'Enter' && cachedSuggestion.value) {\n event.preventDefault()\n event.stopPropagation()\n handleSelectCachedOption(cachedSuggestion.value)\n return\n }\n handleKeydown(event)\n}\n\nwatch([point, keyboardOptions], ([currentPoint, options]) => {\n if (!scrollRef.value || currentPoint < 0) return\n const currentOption = options[currentPoint]\n if (!currentOption) return\n const target = scrollRef.value.contentRef?.querySelector(\n `li[data-key=\"${currentOption}\"]`\n ) as HTMLElement | null\n if (target) {\n scrollIntoContainerView(target, scrollRef.value.containerRef ?? null)\n }\n})\n\n/** 选中选项 */\nconst handleSelect = (option: string) => {\n model.value = option\n dropdownRef.value?.close()\n saveCache()\n emit('select', option)\n}\n\nfunction saveCache() {\n if (!model.value) return\n appendedSuggestions.value = [...appendedSuggestions.value, model.value]\n}\n\nconst handleSelectCachedOption = (cachedOption: string) => {\n appendedSuggestions.value = [...appendedSuggestions.value, cachedOption]\n dropdownRef.value?.close()\n}\n</script>\n"],"mappings":"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"}
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
color: var(--u-text-color-disabled);
|
|
31
31
|
}
|
|
32
32
|
.u-auto-complete.is-disabled .u-tag {
|
|
33
|
-
border: var(--u-border);
|
|
33
|
+
border: var(--u-border-muted);
|
|
34
34
|
}
|
|
35
35
|
.u-auto-complete__option {
|
|
36
36
|
cursor: pointer;
|
|
@@ -83,7 +83,7 @@
|
|
|
83
83
|
}
|
|
84
84
|
.u-auto-complete.is-multiple {
|
|
85
85
|
line-height: 1;
|
|
86
|
-
border: var(--u-border);
|
|
86
|
+
border: var(--u-border-muted);
|
|
87
87
|
box-shadow: var(--u-shadow-emboss);
|
|
88
88
|
transition: border-color 0.25s ease, box-shadow 0.25s ease;
|
|
89
89
|
overflow: hidden;
|
|
@@ -12,8 +12,8 @@ declare const __VLS_base: _$vue.DefineComponent<ButtonProps, _ButtonExposed, {},
|
|
|
12
12
|
onClick?: ((e: MouseEvent) => any) | undefined;
|
|
13
13
|
}>, {
|
|
14
14
|
disabled: boolean;
|
|
15
|
-
loadingIcon: _$vue.Component;
|
|
16
15
|
iconPosition: "left" | "right";
|
|
16
|
+
loadingIcon: _$vue.Component;
|
|
17
17
|
propagate: boolean;
|
|
18
18
|
}, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
|
|
19
19
|
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import _sfc_main$1 from "../icon/icon.js";
|
|
2
|
+
import { injectFormContext } from "../../utils/form-context.js";
|
|
2
3
|
import _sfc_main$2 from "../empty/empty.js";
|
|
3
4
|
import _sfc_main$3 from "../dropdown/dropdown.js";
|
|
4
5
|
import input_default from "../input/input.js";
|
|
@@ -11,7 +12,7 @@ import { useDataMap } from "./use-data-map.js";
|
|
|
11
12
|
import { useSelect } from "./use-select.js";
|
|
12
13
|
import { Fragment, Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, openBlock, provide, renderList, shallowRef, toDisplayString, triggerRef, unref, vShow, watch, withCtx, withDirectives, withModifiers } from "vue";
|
|
13
14
|
import { FORM_EMPTY_CONTENT, bem } from "@veltra/utils";
|
|
14
|
-
import {
|
|
15
|
+
import { useFormFallbackProps, useUserAction } from "@veltra/compositions";
|
|
15
16
|
import { Forest, o } from "@cat-kit/core";
|
|
16
17
|
import { ArrowDown, Close, Search } from "@veltra/icons/normal";
|
|
17
18
|
//#region src/components/cascade/cascade.vue
|
|
@@ -61,7 +62,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
61
62
|
const props = __props;
|
|
62
63
|
const emit = __emit;
|
|
63
64
|
const cls = bem("cascade");
|
|
64
|
-
const { formProps } =
|
|
65
|
+
const { formProps } = injectFormContext();
|
|
65
66
|
const { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {
|
|
66
67
|
size: "default",
|
|
67
68
|
disabled: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cascade.js","names":[],"sources":["../../../src/components/cascade/cascade.vue"],"sourcesContent":["<template>\n <u-dropdown\n v-if=\"!readonly\"\n :class=\"[cls.b, bem.is('disabled', disabled), bem.is('multiple', multiple), cls.m(size)]\"\n :content-class=\"[cls.e('panel'), cls.em('panel', size)]\"\n trigger=\"click\"\n ref=\"dropdownRef\"\n :disabled=\"disabled\"\n width=\"auto\"\n @mouseenter=\"hovered = true\"\n @mouseleave=\"hovered = false\"\n @update:visible=\"!$event && (qs = '')\"\n >\n <template #trigger>\n <!-- 单选展示 -->\n <u-input\n v-if=\"!multiple\"\n :size=\"size\"\n :disabled=\"disabled\"\n :placeholder=\"placeholder\"\n :clearable=\"clearable\"\n native-readonly\n :model-value=\"displayedValue\"\n @clear=\"handleClear\"\n >\n <template #suffix>\n <u-icon :class=\"cls.e('arrow')\"><ArrowDown /></u-icon>\n </template>\n </u-input>\n\n <!-- 多选展示 -->\n <template v-if=\"multiple\">\n <span :class=\"cls.e('placeholder')\" v-show=\"!modelValue?.length\">\n {{ placeholder }}\n </span>\n\n <div v-if=\"modelValue?.length\" :class=\"cls.e('tags')\">\n <u-tag\n v-for=\"tag of tags\"\n :key=\"tag.value\"\n :closable=\"!disabled\"\n @close=\"handleCloseTag(tag)\"\n >\n {{ tag.label }}\n </u-tag>\n <u-tag v-if=\"restTag\"> {{ restTag }}+ </u-tag>\n </div>\n\n <transition name=\"zoom-in\" mode=\"out-in\">\n <u-icon\n v-if=\"clearable && modelValue?.length && hovered && !disabled\"\n :class=\"cls.e('clear')\"\n @click.stop=\"handleClear\"\n >\n <Close />\n </u-icon>\n\n <u-icon :class=\"cls.e('arrow')\" v-else><ArrowDown /></u-icon>\n </transition>\n </template>\n </template>\n\n <template #content>\n <!-- 过滤 -->\n <div v-if=\"filterable\" :class=\"cls.e('panel-filter')\">\n <u-input placeholder=\"输入关键字进行过滤\" v-model=\"qs\" :size=\"size\" clearable>\n <template #suffix>\n <u-icon><Search /></u-icon>\n </template>\n </u-input>\n </div>\n\n <div :class=\"cls.e('content')\" v-if=\"panelItemList.length\">\n <UCascadePanelItem\n v-for=\"({ nodes, key }, index) of panelItemList\"\n :data=\"nodes\"\n :key=\"key\"\n :panel-index=\"index\"\n :value=\"selectedNodeKeys[index]\"\n @click=\"handleClick\"\n @check=\"handleCheck\"\n />\n </div>\n\n <div :class=\"cls.e('empty')\" v-else>\n <UEmpty />\n </div>\n </template>\n </u-dropdown>\n\n <!-- 只读 -->\n <template v-else>\n <div :class=\"[cls.m(size)]\" v-if=\"multiple\">\n <div :class=\"cls.e('tags')\">\n <u-tag v-for=\"tag of tags\" :key=\"tag.value\">\n {{ tag.label }}\n </u-tag>\n </div>\n </div>\n <template v-else>\n {{ displayedValue || FORM_EMPTY_CONTENT }}\n </template>\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { Forest, o } from '@cat-kit/core'\nimport { useFormComponent, useFormFallbackProps, useUserAction } from '@veltra/compositions'\nimport { ArrowDown, Close, Search } from '@veltra/icons/normal'\nimport { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { computed, provide, shallowRef, triggerRef, watch } from 'vue'\n\nimport type { CascadeProps, CascadeEmits, DropdownExposed } from '../../types'\nimport { UDropdown } from '../dropdown'\nimport { UEmpty } from '../empty'\nimport { UIcon } from '../icon'\nimport { UInput } from '../input'\nimport { UTag } from '../tag'\nimport UCascadePanelItem from './cascade-panel-item.vue'\nimport { CascadeDIKey } from './di'\nimport { CascadeNode } from './node'\nimport { useCheck } from './use-check'\nimport { useDataMap } from './use-data-map'\nimport { useSelect } from './use-select'\n\ndefineOptions({\n name: 'Cascade'\n})\n\nconst props = withDefaults(defineProps<CascadeProps>(), {\n labelKey: 'label',\n valueKey: 'value',\n placeholder: '请选择',\n separator: '/',\n clearable: true,\n disabled: undefined,\n readonly: undefined,\n childrenKey: 'children',\n filterable: false,\n data: () => [],\n visibilityLimit: 3\n})\n\nconst emit = defineEmits<CascadeEmits>()\n\nconst cls = bem('cascade')\n\nconst { formProps } = useFormComponent()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\nconst dropdownRef = shallowRef<DropdownExposed>()\n\nconst forest = computed(() => {\n return new Forest<Record<string, unknown>, any>({\n data: (props.data ?? []) as Record<string, unknown>[],\n childrenKey: props.childrenKey,\n createNode: (data, index, depth, _forest, parent) => {\n if (!data) {\n return new CascadeNode({\n data,\n index,\n depth,\n value: '',\n label: '',\n parent\n })\n }\n\n return new CascadeNode({\n data,\n index,\n depth,\n value: o(data).get(props.valueKey) ?? '',\n label: o(data).get(props.labelKey) ?? '',\n parent\n })\n }\n })\n})\n\nconst { dataMap } = useDataMap({ props, forest })\n\nconst { userAction, isUserActive } = useUserAction()\n\nconst {\n displayedValue,\n selectItem,\n updateSingleValue,\n panelItemList,\n getPanelItemList,\n createPanelItem,\n selectedNodeKeys\n} = useSelect({\n props,\n emit,\n dataMap,\n forest,\n isUserActive,\n dropdownRef\n})\n\nconst { hovered, tags, restTag, updateMultipleValue, handleCloseTag, checkItem, checkedSet } =\n useCheck({\n props,\n forest,\n getPanelItemList,\n emit,\n dataMap,\n isUserActive,\n disabled,\n readonly\n })\n\nconst commitSingleSelect = userAction((item: CascadeNode) => {\n if (!props.strict) {\n updateSingleValue()\n } else if (!item.children?.length) {\n updateSingleValue()\n }\n})\n\nfunction handleClick(panelIndex: number, item: CascadeNode) {\n selectItem(panelIndex, item)\n\n if (!props.multiple) {\n commitSingleSelect(item)\n }\n}\n\nconst handleCheck = userAction((item: CascadeNode, checked: boolean) => {\n checkItem(item, checked)\n})\n\nfunction handleClear() {\n if (props.multiple) {\n checkedSet.value.clear()\n triggerRef(checkedSet)\n updateMultipleValue()\n } else {\n selectedNodeKeys.value = []\n updateSingleValue()\n }\n\n emit('clear')\n}\n\n// 过滤\nconst qs = shallowRef<string>('')\n\nwatch([qs, forest], ([qs, forest]) => {\n const { filterable } = props\n if (!filterable || !qs) {\n forest.dfs((node) => {\n node.visible = true\n })\n getPanelItemList(forest.roots)\n return\n }\n\n const cache = new Set<CascadeNode>()\n\n forest.dfs((node) => {\n if (node.label?.toLowerCase().includes(qs.toLowerCase())) {\n node.visible = true\n let parent = node.parent\n while (parent && !cache.has(parent)) {\n parent.visible = true\n cache.add(parent)\n parent = parent.parent\n }\n } else {\n node.visible = false\n }\n })\n\n panelItemList.value = [createPanelItem(forest.roots)]\n})\n\nprovide(CascadeDIKey, {\n cls,\n size,\n disabled,\n readonly,\n cascadeProps: props,\n checkedSet\n})\n</script>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cascade.js","names":[],"sources":["../../../src/components/cascade/cascade.vue"],"sourcesContent":["<template>\n <u-dropdown\n v-if=\"!readonly\"\n :class=\"[cls.b, bem.is('disabled', disabled), bem.is('multiple', multiple), cls.m(size)]\"\n :content-class=\"[cls.e('panel'), cls.em('panel', size)]\"\n trigger=\"click\"\n ref=\"dropdownRef\"\n :disabled=\"disabled\"\n width=\"auto\"\n @mouseenter=\"hovered = true\"\n @mouseleave=\"hovered = false\"\n @update:visible=\"!$event && (qs = '')\"\n >\n <template #trigger>\n <!-- 单选展示 -->\n <u-input\n v-if=\"!multiple\"\n :size=\"size\"\n :disabled=\"disabled\"\n :placeholder=\"placeholder\"\n :clearable=\"clearable\"\n native-readonly\n :model-value=\"displayedValue\"\n @clear=\"handleClear\"\n >\n <template #suffix>\n <u-icon :class=\"cls.e('arrow')\"><ArrowDown /></u-icon>\n </template>\n </u-input>\n\n <!-- 多选展示 -->\n <template v-if=\"multiple\">\n <span :class=\"cls.e('placeholder')\" v-show=\"!modelValue?.length\">\n {{ placeholder }}\n </span>\n\n <div v-if=\"modelValue?.length\" :class=\"cls.e('tags')\">\n <u-tag\n v-for=\"tag of tags\"\n :key=\"tag.value\"\n :closable=\"!disabled\"\n @close=\"handleCloseTag(tag)\"\n >\n {{ tag.label }}\n </u-tag>\n <u-tag v-if=\"restTag\"> {{ restTag }}+ </u-tag>\n </div>\n\n <transition name=\"zoom-in\" mode=\"out-in\">\n <u-icon\n v-if=\"clearable && modelValue?.length && hovered && !disabled\"\n :class=\"cls.e('clear')\"\n @click.stop=\"handleClear\"\n >\n <Close />\n </u-icon>\n\n <u-icon :class=\"cls.e('arrow')\" v-else><ArrowDown /></u-icon>\n </transition>\n </template>\n </template>\n\n <template #content>\n <!-- 过滤 -->\n <div v-if=\"filterable\" :class=\"cls.e('panel-filter')\">\n <u-input placeholder=\"输入关键字进行过滤\" v-model=\"qs\" :size=\"size\" clearable>\n <template #suffix>\n <u-icon><Search /></u-icon>\n </template>\n </u-input>\n </div>\n\n <div :class=\"cls.e('content')\" v-if=\"panelItemList.length\">\n <UCascadePanelItem\n v-for=\"({ nodes, key }, index) of panelItemList\"\n :data=\"nodes\"\n :key=\"key\"\n :panel-index=\"index\"\n :value=\"selectedNodeKeys[index]\"\n @click=\"handleClick\"\n @check=\"handleCheck\"\n />\n </div>\n\n <div :class=\"cls.e('empty')\" v-else>\n <UEmpty />\n </div>\n </template>\n </u-dropdown>\n\n <!-- 只读 -->\n <template v-else>\n <div :class=\"[cls.m(size)]\" v-if=\"multiple\">\n <div :class=\"cls.e('tags')\">\n <u-tag v-for=\"tag of tags\" :key=\"tag.value\">\n {{ tag.label }}\n </u-tag>\n </div>\n </div>\n <template v-else>\n {{ displayedValue || FORM_EMPTY_CONTENT }}\n </template>\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { Forest, o } from '@cat-kit/core'\nimport { useFormFallbackProps, useUserAction } from '@veltra/compositions'\nimport { ArrowDown, Close, Search } from '@veltra/icons/normal'\nimport { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { computed, provide, shallowRef, triggerRef, watch } from 'vue'\n\nimport type { CascadeProps, CascadeEmits, DropdownExposed } from '../../types'\nimport { injectFormContext } from '../../utils/form-context'\nimport { UDropdown } from '../dropdown'\nimport { UEmpty } from '../empty'\nimport { UIcon } from '../icon'\nimport { UInput } from '../input'\nimport { UTag } from '../tag'\nimport UCascadePanelItem from './cascade-panel-item.vue'\nimport { CascadeDIKey } from './di'\nimport { CascadeNode } from './node'\nimport { useCheck } from './use-check'\nimport { useDataMap } from './use-data-map'\nimport { useSelect } from './use-select'\n\ndefineOptions({\n name: 'Cascade'\n})\n\nconst props = withDefaults(defineProps<CascadeProps>(), {\n labelKey: 'label',\n valueKey: 'value',\n placeholder: '请选择',\n separator: '/',\n clearable: true,\n disabled: undefined,\n readonly: undefined,\n childrenKey: 'children',\n filterable: false,\n data: () => [],\n visibilityLimit: 3\n})\n\nconst emit = defineEmits<CascadeEmits>()\n\nconst cls = bem('cascade')\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\nconst dropdownRef = shallowRef<DropdownExposed>()\n\nconst forest = computed(() => {\n return new Forest<Record<string, unknown>, any>({\n data: (props.data ?? []) as Record<string, unknown>[],\n childrenKey: props.childrenKey,\n createNode: (data, index, depth, _forest, parent) => {\n if (!data) {\n return new CascadeNode({\n data,\n index,\n depth,\n value: '',\n label: '',\n parent\n })\n }\n\n return new CascadeNode({\n data,\n index,\n depth,\n value: o(data).get(props.valueKey) ?? '',\n label: o(data).get(props.labelKey) ?? '',\n parent\n })\n }\n })\n})\n\nconst { dataMap } = useDataMap({ props, forest })\n\nconst { userAction, isUserActive } = useUserAction()\n\nconst {\n displayedValue,\n selectItem,\n updateSingleValue,\n panelItemList,\n getPanelItemList,\n createPanelItem,\n selectedNodeKeys\n} = useSelect({\n props,\n emit,\n dataMap,\n forest,\n isUserActive,\n dropdownRef\n})\n\nconst { hovered, tags, restTag, updateMultipleValue, handleCloseTag, checkItem, checkedSet } =\n useCheck({\n props,\n forest,\n getPanelItemList,\n emit,\n dataMap,\n isUserActive,\n disabled,\n readonly\n })\n\nconst commitSingleSelect = userAction((item: CascadeNode) => {\n if (!props.strict) {\n updateSingleValue()\n } else if (!item.children?.length) {\n updateSingleValue()\n }\n})\n\nfunction handleClick(panelIndex: number, item: CascadeNode) {\n selectItem(panelIndex, item)\n\n if (!props.multiple) {\n commitSingleSelect(item)\n }\n}\n\nconst handleCheck = userAction((item: CascadeNode, checked: boolean) => {\n checkItem(item, checked)\n})\n\nfunction handleClear() {\n if (props.multiple) {\n checkedSet.value.clear()\n triggerRef(checkedSet)\n updateMultipleValue()\n } else {\n selectedNodeKeys.value = []\n updateSingleValue()\n }\n\n emit('clear')\n}\n\n// 过滤\nconst qs = shallowRef<string>('')\n\nwatch([qs, forest], ([qs, forest]) => {\n const { filterable } = props\n if (!filterable || !qs) {\n forest.dfs((node) => {\n node.visible = true\n })\n getPanelItemList(forest.roots)\n return\n }\n\n const cache = new Set<CascadeNode>()\n\n forest.dfs((node) => {\n if (node.label?.toLowerCase().includes(qs.toLowerCase())) {\n node.visible = true\n let parent = node.parent\n while (parent && !cache.has(parent)) {\n parent.visible = true\n cache.add(parent)\n parent = parent.parent\n }\n } else {\n node.visible = false\n }\n })\n\n panelItemList.value = [createPanelItem(forest.roots)]\n})\n\nprovide(CascadeDIKey, {\n cls,\n size,\n disabled,\n readonly,\n cascadeProps: props,\n checkedSet\n})\n</script>\n"],"mappings":"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"}
|
|
@@ -4,12 +4,12 @@ import * as _$vue from "vue";
|
|
|
4
4
|
//#region src/components/cascade/cascade.vue.d.ts
|
|
5
5
|
declare const __VLS_export: _$vue.DefineComponent<CascadeProps, {}, {}, {}, {}, _$vue.ComponentOptionsMixin, _$vue.ComponentOptionsMixin, {} & {
|
|
6
6
|
"update:modelValue": (value?: string | string[] | undefined) => any;
|
|
7
|
-
change: (...args: [value?: string | undefined, label?: string | undefined, item?: Record<string, any> | undefined] | [value: string[], label: string[], data: Record<string, any>[]]) => any;
|
|
8
7
|
clear: () => any;
|
|
8
|
+
change: (...args: [value?: string | undefined, label?: string | undefined, item?: Record<string, any> | undefined] | [value: string[], label: string[], data: Record<string, any>[]]) => any;
|
|
9
9
|
}, string, _$vue.PublicProps, Readonly<CascadeProps> & Readonly<{
|
|
10
10
|
"onUpdate:modelValue"?: ((value?: string | string[] | undefined) => any) | undefined;
|
|
11
|
-
onChange?: ((...args: [value?: string | undefined, label?: string | undefined, item?: Record<string, any> | undefined] | [value: string[], label: string[], data: Record<string, any>[]]) => any) | undefined;
|
|
12
11
|
onClear?: (() => any) | undefined;
|
|
12
|
+
onChange?: ((...args: [value?: string | undefined, label?: string | undefined, item?: Record<string, any> | undefined] | [value: string[], label: string[], data: Record<string, any>[]]) => any) | undefined;
|
|
13
13
|
}>, {
|
|
14
14
|
labelKey: string;
|
|
15
15
|
valueKey: string;
|
|
@@ -19,9 +19,9 @@ declare const __VLS_export: _$vue.DefineComponent<CascadeProps, {}, {}, {}, {},
|
|
|
19
19
|
readonly: boolean;
|
|
20
20
|
placeholder: string;
|
|
21
21
|
clearable: boolean;
|
|
22
|
-
separator: string;
|
|
23
22
|
filterable: boolean;
|
|
24
23
|
visibilityLimit: number;
|
|
24
|
+
separator: string;
|
|
25
25
|
}, {}, {}, {}, string, _$vue.ComponentProvideOptions, false, {}, any>;
|
|
26
26
|
declare const _default: typeof __VLS_export;
|
|
27
27
|
//#endregion
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { injectFormContext } from "../../utils/form-context.js";
|
|
1
2
|
import _sfc_main$1 from "../tag/tag.js";
|
|
2
3
|
import { Fragment, computed, createBlock, createElementBlock, createTextVNode, defineComponent, mergeModels, normalizeClass, openBlock, renderSlot, toDisplayString, unref, useModel, useSlots, withCtx } from "vue";
|
|
3
4
|
import { FORM_EMPTY_CONTENT, bem } from "@veltra/utils";
|
|
4
|
-
import {
|
|
5
|
+
import { useFormFallbackProps } from "@veltra/compositions";
|
|
5
6
|
//#region src/components/checkbox/checkbox-button.vue
|
|
6
7
|
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
7
8
|
name: "CheckboxButton",
|
|
@@ -37,7 +38,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
37
38
|
useSlots();
|
|
38
39
|
const cls = bem("checkbox-button");
|
|
39
40
|
const checked = useModel(__props, "modelValue");
|
|
40
|
-
const { formProps } =
|
|
41
|
+
const { formProps } = injectFormContext();
|
|
41
42
|
const { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {
|
|
42
43
|
size: "default",
|
|
43
44
|
disabled: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkbox-button.js","names":[],"sources":["../../../src/components/checkbox/checkbox-button.vue"],"sourcesContent":["<template>\n <div v-if=\"!readonly\" :class=\"className\" @click=\"handleInput\">\n <slot />\n </div>\n\n <u-tag v-else-if=\"checked !== undefined\" :type=\"checked ? 'success' : 'danger'\">\n {{ checked ? '是' : '否' }}\n </u-tag>\n\n <template v-else>\n {{ FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport {
|
|
1
|
+
{"version":3,"file":"checkbox-button.js","names":[],"sources":["../../../src/components/checkbox/checkbox-button.vue"],"sourcesContent":["<template>\n <div v-if=\"!readonly\" :class=\"className\" @click=\"handleInput\">\n <slot />\n </div>\n\n <u-tag v-else-if=\"checked !== undefined\" :type=\"checked ? 'success' : 'danger'\">\n {{ checked ? '是' : '否' }}\n </u-tag>\n\n <template v-else>\n {{ FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { CheckboxButtonProps, CheckboxButtonEmits } from '../../types'\nimport { injectFormContext } from '../../utils/form-context'\nimport { UTag } from '../tag'\n\ndefineOptions({\n name: 'CheckboxButton'\n})\n\nconst props = withDefaults(defineProps<CheckboxButtonProps>(), {\n disabled: undefined,\n readonly: undefined,\n type: 'primary',\n round: false\n})\n\nconst emit = defineEmits<CheckboxButtonEmits>()\n\nconst slot = defineSlots<{\n default(): any\n}>()\n\nconst cls = bem('checkbox-button')\n\nconst checked = defineModel<boolean>()\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\nconst className = computed(() => {\n return [\n cls.b,\n cls.m(size.value),\n bem.is(props.type),\n bem.is('round', props.round),\n bem.is('disabled', disabled.value),\n bem.is('checked', checked.value)\n ]\n})\n\nconst handleInput = () => {\n checked.value = !checked.value\n emit('change', !!checked.value)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BA,MAAM,QAAQ;EAOd,MAAM,OAAO;AAEA,YAAA;EAIb,MAAM,MAAM,IAAI,kBAAiB;EAEjC,MAAM,UAAU,SAAoB,SAAA,aAAC;EAErC,MAAM,EAAE,cAAc,mBAAkB;EAExC,MAAM,EAAE,MAAM,UAAU,aAAa,qBAAqB,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE;GAClF,MAAM;GACN,UAAU;GACV,UAAU;GACX,CAAA;EAED,MAAM,YAAY,eAAe;AAC/B,UAAO;IACL,IAAI;IACJ,IAAI,EAAE,KAAK,MAAM;IACjB,IAAI,GAAG,MAAM,KAAK;IAClB,IAAI,GAAG,SAAS,MAAM,MAAM;IAC5B,IAAI,GAAG,YAAY,SAAS,MAAM;IAClC,IAAI,GAAG,WAAW,QAAQ,MAAK;IACjC;IACD;EAED,MAAM,oBAAoB;AACxB,WAAQ,QAAQ,CAAC,QAAQ;AACzB,QAAK,UAAU,CAAC,CAAC,QAAQ,MAAK;;;WAhElB,MAAA,SAAQ,IAAA,WAAA,EAApB,mBAEM,OAAA;;IAFiB,OAAK,eAAE,UAAA,MAAS;IAAG,SAAO;OAC/C,WAAQ,KAAA,QAAA,UAAA,CAAA,EAAA,EAAA,IAGQ,QAAA,UAAY,KAAA,KAAA,WAAA,EAA9B,YAEQ,MAAA,YAAA,EAAA;;IAFkC,MAAM,QAAA,QAAO,YAAA;;2BAC5B,CAAA,gBAAA,gBAAtB,QAAA,QAAO,MAAA,IAAA,EAAA,EAAA,CAAA,CAAA;;oCAGZ,mBAEW,UAAA,EAAA,KAAA,GAAA,EAAA,CAAA,gBAAA,gBADN,MAAA,mBAAkB,CAAA,EAAA,EAAA,CAAA,EAAA,GAAA"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { injectFormContext } from "../../utils/form-context.js";
|
|
1
2
|
import { Transition, computed, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, mergeModels, normalizeClass, openBlock, renderSlot, unref, useModel, withCtx } from "vue";
|
|
2
3
|
import { bem } from "@veltra/utils";
|
|
3
|
-
import {
|
|
4
|
+
import { useFormFallbackProps } from "@veltra/compositions";
|
|
4
5
|
//#region src/components/checkbox/checkbox.vue
|
|
5
6
|
const _hoisted_1 = {
|
|
6
7
|
key: 0,
|
|
@@ -37,7 +38,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
37
38
|
const emit = __emit;
|
|
38
39
|
const cls = bem("checkbox");
|
|
39
40
|
const checked = useModel(__props, "modelValue");
|
|
40
|
-
const { formProps } =
|
|
41
|
+
const { formProps } = injectFormContext();
|
|
41
42
|
const { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {
|
|
42
43
|
size: "default",
|
|
43
44
|
disabled: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkbox.js","names":["$slots"],"sources":["../../../src/components/checkbox/checkbox.vue"],"sourcesContent":["<template>\n <label :class=\"className\">\n <span :class=\"cls.e('wrap')\">\n <transition name=\"zoom-in\" mode=\"out-in\">\n <svg viewBox=\"0 0 64 64\" v-if=\"checked\" fill=\"currentColor\">\n <path\n d=\"M50.42,16.76L22.34,39.45l-8.1-11.46c-1.12-1.58-3.3-1.96-4.88-0.84c-1.58,1.12-1.95,3.3-0.84,4.88l10.26,14.51 c0.56,0.79,1.42,1.31,2.38,1.45c0.16,0.02,0.32,0.03,0.48,0.03c0.8,0,1.57-0.27,2.2-0.78l30.99-25.03c1.5-1.21,1.74-3.42,0.52-4.92 C54.13,15.78,51.93,15.55,50.42,16.76z\"\n ></path>\n </svg>\n <span v-else-if=\"indeterminate\" :class=\"cls.m('indeterminate')\"></span>\n </transition>\n </span>\n\n <input type=\"checkbox\" :checked=\"checked\" :disabled=\"disabled\" hidden @click=\"handleInput\" />\n\n <span :class=\"cls.e('label')\" v-if=\"$slots.default\"><slot /> </span>\n </label>\n</template>\n\n<script lang=\"ts\" setup>\nimport {
|
|
1
|
+
{"version":3,"file":"checkbox.js","names":["$slots"],"sources":["../../../src/components/checkbox/checkbox.vue"],"sourcesContent":["<template>\n <label :class=\"className\">\n <span :class=\"cls.e('wrap')\">\n <transition name=\"zoom-in\" mode=\"out-in\">\n <svg viewBox=\"0 0 64 64\" v-if=\"checked\" fill=\"currentColor\">\n <path\n d=\"M50.42,16.76L22.34,39.45l-8.1-11.46c-1.12-1.58-3.3-1.96-4.88-0.84c-1.58,1.12-1.95,3.3-0.84,4.88l10.26,14.51 c0.56,0.79,1.42,1.31,2.38,1.45c0.16,0.02,0.32,0.03,0.48,0.03c0.8,0,1.57-0.27,2.2-0.78l30.99-25.03c1.5-1.21,1.74-3.42,0.52-4.92 C54.13,15.78,51.93,15.55,50.42,16.76z\"\n ></path>\n </svg>\n <span v-else-if=\"indeterminate\" :class=\"cls.m('indeterminate')\"></span>\n </transition>\n </span>\n\n <input type=\"checkbox\" :checked=\"checked\" :disabled=\"disabled\" hidden @click=\"handleInput\" />\n\n <span :class=\"cls.e('label')\" v-if=\"$slots.default\"><slot /> </span>\n </label>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { bem } from '@veltra/utils'\nimport { computed } from 'vue'\n\nimport type { CheckboxProps, CheckboxEmits } from '../../types'\nimport { injectFormContext } from '../../utils/form-context'\n\ndefineOptions({\n name: 'Checkbox'\n})\nconst props = withDefaults(defineProps<CheckboxProps>(), {\n disabled: undefined,\n readonly: undefined\n})\n\nconst emit = defineEmits<CheckboxEmits>()\nconst cls = bem('checkbox')\n\nconst checked = defineModel<boolean>()\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\nconst className = computed(() => {\n return [\n cls.b,\n cls.m(size.value),\n bem.is('disabled', disabled.value),\n bem.is('readonly', readonly.value),\n bem.is('checked', checked.value || props.indeterminate)\n ]\n})\n\nconst handleInput = (e: MouseEvent) => {\n if (readonly.value) return\n const target = e.target as HTMLInputElement\n checked.value = target.checked\n emit('change', target.checked, e)\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8BA,MAAM,QAAQ;EAKd,MAAM,OAAO;EACb,MAAM,MAAM,IAAI,WAAU;EAE1B,MAAM,UAAU,SAAoB,SAAA,aAAC;EAErC,MAAM,EAAE,cAAc,mBAAkB;EAExC,MAAM,EAAE,MAAM,UAAU,aAAa,qBAAqB,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE;GAClF,MAAM;GACN,UAAU;GACV,UAAU;GACX,CAAA;EAED,MAAM,YAAY,eAAe;AAC/B,UAAO;IACL,IAAI;IACJ,IAAI,EAAE,KAAK,MAAM;IACjB,IAAI,GAAG,YAAY,SAAS,MAAM;IAClC,IAAI,GAAG,YAAY,SAAS,MAAM;IAClC,IAAI,GAAG,WAAW,QAAQ,SAAS,MAAM,cAAa;IACxD;IACD;EAED,MAAM,eAAe,MAAkB;AACrC,OAAI,SAAS,MAAO;GACpB,MAAM,SAAS,EAAE;AACjB,WAAQ,QAAQ,OAAO;AACvB,QAAK,UAAU,OAAO,SAAS,EAAC;;;uBA7DhC,mBAeQ,SAAA,EAfA,OAAK,eAAE,UAAA,MAAS,EAAA,EAAA;IACtB,mBASO,QAAA,EATA,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,OAAA,CAAA,EAAA,EAAA,CACjB,YAOa,YAAA;KAPD,MAAK;KAAU,MAAK;;4BAKxB,CAJyB,QAAA,SAAA,WAAA,EAA/B,mBAIM,OAJN,YAIM,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAHJ,mBAEQ,QAAA,EADN,GAAE,sRAAoR,EAAA,MAAA,GAAA,CAAA,EAAA,CAAA,IAGzQ,QAAA,iBAAA,WAAA,EAAjB,mBAAuE,QAAA;;MAAtC,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,gBAAA,CAAA;;;;IAIjD,mBAA6F,SAAA;KAAtF,MAAK;KAAY,SAAS,QAAA;KAAU,UAAU,MAAA,SAAQ;KAAE,QAAA;KAAQ,SAAO;;IAE1CA,KAAAA,OAAO,WAAA,WAAA,EAA3C,mBAAoE,QAAA;;KAA7D,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,QAAA,CAAA;QAAiC,WAAQ,KAAA,QAAA,UAAA,CAAA,EAAA,EAAA,IAAA,mBAAA,QAAA,KAAA"}
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
}
|
|
31
31
|
.u-checkbox.is-checked.is-disabled .u-checkbox__wrap {
|
|
32
32
|
background-color: var(--u-text-color-disabled);
|
|
33
|
-
border-color: var(--u-border-color);
|
|
33
|
+
border-color: var(--u-border-muted-color);
|
|
34
34
|
}
|
|
35
35
|
.u-checkbox.is-disabled {
|
|
36
36
|
cursor: not-allowed;
|
|
@@ -92,7 +92,7 @@
|
|
|
92
92
|
}
|
|
93
93
|
|
|
94
94
|
.u-checkbox-button {
|
|
95
|
-
border: var(--u-border);
|
|
95
|
+
border: var(--u-border-muted);
|
|
96
96
|
vertical-align: middle;
|
|
97
97
|
display: inline-flex;
|
|
98
98
|
align-items: center;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import { injectFormContext } from "../../utils/form-context.js";
|
|
1
2
|
import _sfc_main$1 from "../checkbox/checkbox.js";
|
|
2
3
|
import _sfc_main$2 from "../tag/tag.js";
|
|
3
4
|
import { Fragment, createBlock, createElementBlock, createElementVNode, createTextVNode, defineComponent, mergeModels, normalizeClass, openBlock, renderList, toDisplayString, unref, useModel, withCtx } from "vue";
|
|
4
5
|
import { FORM_EMPTY_CONTENT, bem } from "@veltra/utils";
|
|
5
|
-
import {
|
|
6
|
+
import { useFormFallbackProps } from "@veltra/compositions";
|
|
6
7
|
//#region src/components/checkbox-group/checkbox-group.vue
|
|
7
8
|
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
8
9
|
name: "CheckboxGroup",
|
|
@@ -35,7 +36,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
35
36
|
const props = __props;
|
|
36
37
|
const model = useModel(__props, "modelValue");
|
|
37
38
|
const cls = bem("checkbox-group");
|
|
38
|
-
const { formProps } =
|
|
39
|
+
const { formProps } = injectFormContext();
|
|
39
40
|
const { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {
|
|
40
41
|
size: "default",
|
|
41
42
|
disabled: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkbox-group.js","names":[],"sources":["../../../src/components/checkbox-group/checkbox-group.vue"],"sourcesContent":["<template>\n <div :class=\"[cls.b, cls.m(size), bem.is('block', block)]\" v-if=\"!readonly\">\n <u-checkbox\n v-for=\"item of items\"\n :key=\"item[valueKey]\"\n :model-value=\"getCheckStatus(item)\"\n @update:model-value=\"handleUpdate($event, item)\"\n :disabled=\"disabled\"\n :size=\"size\"\n >\n {{ item[labelKey] }}\n </u-checkbox>\n </div>\n\n <div v-else-if=\"model?.length\" :class=\"[cls.m(size), cls.e('readonly-tags')]\">\n <div :class=\"cls.e('tags')\">\n <u-tag v-for=\"tag of model\" :key=\"tag\">\n {{ getLabel(tag) }}\n </u-tag>\n </div>\n </div>\n\n <template v-else>\n {{ FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport {
|
|
1
|
+
{"version":3,"file":"checkbox-group.js","names":[],"sources":["../../../src/components/checkbox-group/checkbox-group.vue"],"sourcesContent":["<template>\n <div :class=\"[cls.b, cls.m(size), bem.is('block', block)]\" v-if=\"!readonly\">\n <u-checkbox\n v-for=\"item of items\"\n :key=\"item[valueKey]\"\n :model-value=\"getCheckStatus(item)\"\n @update:model-value=\"handleUpdate($event, item)\"\n :disabled=\"disabled\"\n :size=\"size\"\n >\n {{ item[labelKey] }}\n </u-checkbox>\n </div>\n\n <div v-else-if=\"model?.length\" :class=\"[cls.m(size), cls.e('readonly-tags')]\">\n <div :class=\"cls.e('tags')\">\n <u-tag v-for=\"tag of model\" :key=\"tag\">\n {{ getLabel(tag) }}\n </u-tag>\n </div>\n </div>\n\n <template v-else>\n {{ FORM_EMPTY_CONTENT }}\n </template>\n</template>\n\n<script lang=\"ts\" setup>\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { bem, FORM_EMPTY_CONTENT } from '@veltra/utils'\n\nimport type { CheckboxGroupProps, CheckboxGroupEmits } from '../../types'\nimport { injectFormContext } from '../../utils/form-context'\nimport { UCheckbox } from '../checkbox'\nimport { UTag } from '../tag'\n\ndefineOptions({\n name: 'CheckboxGroup'\n})\n\nconst props = withDefaults(defineProps<CheckboxGroupProps>(), {\n labelKey: 'label',\n valueKey: 'value',\n disabled: undefined,\n readonly: undefined\n})\n\ndefineEmits<CheckboxGroupEmits>()\n\nconst model = defineModel<any[]>()\n\nconst cls = bem('checkbox-group')\n\nconst { formProps } = injectFormContext()\n\nconst { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n size: 'default',\n disabled: false,\n readonly: false\n})\n\n/**\n * 获取checkbox的选中状态\n * @param item - 模型对象\n * @returns 模型值是否存在于model.value中\n */\nconst getCheckStatus = (item: Record<string, string | number>): boolean => {\n const { valueKey } = props\n const value = item[valueKey]\n if (!value || !model.value) return false\n return model.value.includes(value)\n}\n\n/**\n * 处理更新操作\n * @param checked - 指示是否选中\n * @param item - 更新的项\n */\nconst handleUpdate = (checked: boolean, item: Record<string, string | number>) => {\n const { valueKey } = props\n const value = item[valueKey]\n if (!value) return\n if (checked) {\n model.value = [...(model.value ?? []), value]\n } else {\n model.value = model.value?.filter((v) => v !== value)\n }\n}\n\nconst getLabel = (value: string | number) => {\n const { items, valueKey, labelKey } = props\n const item = items.find((item) => item[valueKey] === value)\n return item?.[labelKey]\n}\n</script>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwCA,MAAM,QAAQ;EASd,MAAM,QAAQ,SAAkB,SAAA,aAAC;EAEjC,MAAM,MAAM,IAAI,iBAAgB;EAEhC,MAAM,EAAE,cAAc,mBAAkB;EAExC,MAAM,EAAE,MAAM,UAAU,aAAa,qBAAqB,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE;GAClF,MAAM;GACN,UAAU;GACV,UAAU;GACX,CAAA;;;;;;EAOD,MAAM,kBAAkB,SAAmD;GACzE,MAAM,EAAE,aAAa;GACrB,MAAM,QAAQ,KAAK;AACnB,OAAI,CAAC,SAAS,CAAC,MAAM,MAAO,QAAO;AACnC,UAAO,MAAM,MAAM,SAAS,MAAK;;;;;;;EAQnC,MAAM,gBAAgB,SAAkB,SAA0C;GAChF,MAAM,EAAE,aAAa;GACrB,MAAM,QAAQ,KAAK;AACnB,OAAI,CAAC,MAAO;AACZ,OAAI,QACF,OAAM,QAAQ,CAAC,GAAI,MAAM,SAAS,EAAE,EAAG,MAAK;OAE5C,OAAM,QAAQ,MAAM,OAAO,QAAQ,MAAM,MAAM,MAAK;;EAIxD,MAAM,YAAY,UAA2B;GAC3C,MAAM,EAAE,OAAO,UAAU,aAAa;AAEtC,UADa,MAAM,MAAM,SAAS,KAAK,cAAc,MAC9C,GAAO;;;WA3FoD,MAAA,SAAQ,IAAA,WAAA,EAA1E,mBAWM,OAAA;;IAXA,OAAK,eAAA;KAAG,MAAA,IAAG,CAAC;KAAG,MAAA,IAAG,CAAC,EAAE,MAAA,KAAI,CAAA;KAAG,MAAA,IAAG,CAAC,GAAE,SAAU,QAAA,MAAK;KAAA,CAAA;yBACrD,mBASa,UAAA,MAAA,WARI,QAAA,QAAR,SAAI;wBADb,YASa,MAAA,YAAA,EAAA;KAPV,KAAK,KAAK,QAAA;KACV,eAAa,eAAe,KAAI;KAChC,wBAAkB,WAAE,aAAa,QAAQ,KAAI;KAC7C,UAAU,MAAA,SAAQ;KAClB,MAAM,MAAA,KAAI;;4BAES,CAAA,gBAAA,gBAAjB,KAAK,QAAA,UAAQ,EAAA,EAAA,CAAA,CAAA;;;;;;;;qBAIJ,MAAA,OAAO,UAAA,WAAA,EAAvB,mBAMM,OAAA;;IAN0B,OAAK,eAAA,CAAG,MAAA,IAAG,CAAC,EAAE,MAAA,KAAI,CAAA,EAAG,MAAA,IAAG,CAAC,EAAC,gBAAA,CAAA,CAAA;OACxD,mBAIM,OAAA,EAJA,OAAK,eAAE,MAAA,IAAG,CAAC,EAAC,OAAA,CAAA,EAAA,EAAA,EAAA,UAAA,KAAA,EAChB,mBAEQ,UAAA,MAAA,WAFa,MAAA,QAAP,QAAG;wBAAjB,YAEQ,MAAA,YAAA,EAAA,EAFqB,KAAK,KAAG,EAAA;4BAChB,CAAA,gBAAA,gBAAhB,SAAS,IAAG,CAAA,EAAA,EAAA,CAAA,CAAA;;;wCAKrB,mBAEW,UAAA,EAAA,KAAA,GAAA,EAAA,CAAA,gBAAA,gBADN,MAAA,mBAAkB,CAAA,EAAA,EAAA,CAAA,EAAA,GAAA"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import _sfc_main$1 from "../scroll/scroll.js";
|
|
2
|
+
import { injectFormContext } from "../../utils/form-context.js";
|
|
2
3
|
import { computed, createBlock, createElementVNode, defineComponent, mergeModels, normalizeClass, normalizeStyle, onBeforeUnmount, openBlock, shallowRef, unref, useModel, useTemplateRef, watch, withCtx, withKeys, withModifiers } from "vue";
|
|
3
4
|
import { bem, zIndex } from "@veltra/utils";
|
|
4
|
-
import {
|
|
5
|
+
import { useFormFallbackProps } from "@veltra/compositions";
|
|
5
6
|
import { Compartment, EditorState } from "@codemirror/state";
|
|
6
7
|
import { oneDark } from "@codemirror/theme-one-dark";
|
|
7
8
|
import { ViewPlugin, tooltips } from "@codemirror/view";
|
|
@@ -40,7 +41,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
40
41
|
const props = __props;
|
|
41
42
|
const model = useModel(__props, "modelValue");
|
|
42
43
|
const cls = bem("code-editor");
|
|
43
|
-
const { formProps } =
|
|
44
|
+
const { formProps } = injectFormContext();
|
|
44
45
|
const { disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {
|
|
45
46
|
disabled: false,
|
|
46
47
|
readonly: false
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-editor.js","names":[],"sources":["../../../src/components/code-editor/code-editor.vue"],"sourcesContent":["<template>\n <u-scroll :class=\"className\" :style=\"rootStyle\" @keyup.enter.stop>\n <div ref=\"container\"></div>\n </u-scroll>\n</template>\n\n<script lang=\"ts\" setup>\nimport { Compartment, EditorState, type Extension } from '@codemirror/state'\nimport { oneDark } from '@codemirror/theme-one-dark'\nimport { ViewPlugin, tooltips, type ViewUpdate } from '@codemirror/view'\nimport { useFormComponent, useFormFallbackProps } from '@veltra/compositions'\nimport { bem, zIndex } from '@veltra/utils'\nimport { EditorView, basicSetup } from 'codemirror'\nimport {\n computed,\n onBeforeUnmount,\n shallowRef,\n useTemplateRef,\n watch,\n type CSSProperties\n} from 'vue'\n\nimport type { CodeEditorLang, CodeEditorProps } from '../../types'\nimport { UScroll } from '../scroll'\n\ndefineOptions({ name: 'CodeEditor' })\n\nconst props = withDefaults(defineProps<CodeEditorProps>(), {\n disabled: undefined,\n readonly: undefined,\n dark: false,\n defaultLines: 8\n})\n\nconst model = defineModel<string>()\n\nconst cls = bem('code-editor')\n\nconst { formProps } = useFormComponent()\n\nconst { disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n disabled: false,\n readonly: false\n})\n\nconst className = computed<string[]>(() => [\n cls.b,\n bem.is('disabled', disabled.value),\n bem.is('readonly', readonly.value),\n bem.is('dark', props.dark)\n])\n\nconst rootStyle = computed<CSSProperties>(() => ({\n '--u-code-editor-default-lines': Math.max(1, props.defaultLines)\n}))\n\nconst containerRef = useTemplateRef('container')\nconst editor = shallowRef<EditorView | null>(null)\n\nconst langLoaders: Record<CodeEditorLang, () => Promise<Extension>> = {\n js: () => import('@codemirror/lang-javascript').then((m) => m.javascript({ typescript: true })),\n sql: () => import('@codemirror/lang-sql').then((m) => m.sql()),\n java: () => import('@codemirror/lang-java').then((m) => m.java()),\n json: () => import('@codemirror/lang-json').then((m) => m.json())\n}\n\nconst themeCompartment = new Compartment()\nconst editableCompartment = new Compartment()\nconst readOnlyCompartment = new Compartment()\nconst langCompartment = new Compartment()\n\nlet phantomGutter: HTMLElement | null = null\nlet phantomContainer: HTMLElement | null = null\nlet lastPhantomKey = ''\n\nfunction resetPhantomCache() {\n phantomGutter = null\n phantomContainer = null\n lastPhantomKey = ''\n}\n\n/**\n * 在 .cm-lineNumbers 末尾追加占位行号 DOM,使可视行号数量补齐到 defaultLines。\n * CodeMirror 的 lineNumbers() 仅为真实文档行渲染行号,超出部分由本逻辑补全。\n */\nfunction syncPhantomLineNumbers() {\n const view = editor.value\n if (!view) return\n\n if (!phantomGutter || !phantomGutter.isConnected) {\n phantomGutter = view.dom.querySelector<HTMLElement>('.cm-gutter.cm-lineNumbers')\n }\n if (!phantomGutter) return\n\n if (!phantomContainer) {\n phantomContainer = document.createElement('div')\n phantomContainer.className = 'cm-phantom-lines'\n }\n if (\n phantomContainer.parentElement !== phantomGutter ||\n phantomContainer !== phantomGutter.lastElementChild\n ) {\n phantomGutter.appendChild(phantomContainer)\n }\n\n const realLines = view.state.doc.lines\n const target = Math.max(0, Math.max(1, props.defaultLines) - realLines)\n const lineHeight = view.defaultLineHeight\n\n const key = `${realLines}|${target}|${lineHeight}`\n if (key === lastPhantomKey) return\n lastPhantomKey = key\n\n while (phantomContainer.children.length > target) {\n phantomContainer.lastElementChild!.remove()\n }\n while (phantomContainer.children.length < target) {\n const el = document.createElement('div')\n el.className = 'cm-gutterElement cm-gutterElement-phantom'\n phantomContainer.appendChild(el)\n }\n for (let i = 0; i < target; i++) {\n const el = phantomContainer.children[i] as HTMLElement\n const num = String(realLines + i + 1)\n if (el.textContent !== num) el.textContent = num\n if (lineHeight && el.style.height !== `${lineHeight}px`) {\n el.style.height = `${lineHeight}px`\n }\n }\n}\n\nconst phantomLineNumbersPlugin = ViewPlugin.fromClass(\n class {\n update(update: ViewUpdate) {\n if (update.docChanged || update.geometryChanged) {\n syncPhantomLineNumbers()\n }\n }\n }\n)\n\nfunction buildExtensions(): Extension[] {\n return [\n basicSetup,\n tooltips({ parent: document.body }),\n EditorView.theme({\n '.cm-tooltip': { zIndex: zIndex() }\n }),\n themeCompartment.of(props.dark ? oneDark : []),\n editableCompartment.of(EditorView.editable.of(!disabled.value)),\n readOnlyCompartment.of(EditorState.readOnly.of(readonly.value)),\n langCompartment.of([]),\n phantomLineNumbersPlugin\n ]\n}\n\nlet editorToken = 0\nlet langToken = 0\n\nasync function applyLanguage() {\n const view = editor.value\n if (!view) return\n const myToken = ++langToken\n const { language } = props\n const ext = language ? await langLoaders[language]() : []\n if (myToken !== langToken || editor.value !== view) return\n view.dispatch({ effects: langCompartment.reconfigure(ext) })\n}\n\nfunction destroyEditor() {\n ++editorToken\n ++langToken\n editor.value?.destroy()\n editor.value = null\n resetPhantomCache()\n}\n\nfunction createEditor() {\n destroyEditor()\n const myToken = ++editorToken\n const parent = containerRef.value\n if (!parent) return\n\n const view = new EditorView({\n doc: model.value,\n extensions: buildExtensions(),\n parent,\n dispatch(tr) {\n view.update([tr])\n if (tr.docChanged) {\n model.value = tr.state.doc.toString()\n }\n }\n })\n\n if (myToken !== editorToken) {\n view.destroy()\n return\n }\n\n editor.value = view\n syncPhantomLineNumbers()\n applyLanguage()\n}\n\nwatch(\n containerRef,\n (el) => {\n if (el) createEditor()\n else destroyEditor()\n },\n { immediate: true, flush: 'post' }\n)\n\nwatch(() => props.language, applyLanguage)\n\nwatch(\n () => props.dark,\n (dark) => {\n editor.value?.dispatch({\n effects: themeCompartment.reconfigure(dark ? oneDark : [])\n })\n }\n)\n\nwatch(disabled, (v) => {\n editor.value?.dispatch({\n effects: editableCompartment.reconfigure(EditorView.editable.of(!v))\n })\n})\n\nwatch(readonly, (v) => {\n editor.value?.dispatch({\n effects: readOnlyCompartment.reconfigure(EditorState.readOnly.of(v))\n })\n})\n\nwatch(() => props.defaultLines, syncPhantomLineNumbers)\n\nwatch(\n [() => props.modelValue, editor],\n ([v, e]) => {\n if (!e) return\n if (e.composing) return\n const next = v ?? ''\n if (e.state.doc.toString() === next) return\n\n const valueLength = next.length\n const inRange = e.state.selection.ranges.every(\n (range) => range.anchor <= valueLength && range.head <= valueLength\n )\n e.dispatch({\n changes: { from: 0, to: e.state.doc.length, insert: next },\n selection: inRange ? e.state.selection : { anchor: 0, head: 0 },\n scrollIntoView: true\n })\n },\n { immediate: true }\n)\n\nonBeforeUnmount(destroyEditor)\n</script>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"code-editor.js","names":[],"sources":["../../../src/components/code-editor/code-editor.vue"],"sourcesContent":["<template>\n <u-scroll :class=\"className\" :style=\"rootStyle\" @keyup.enter.stop>\n <div ref=\"container\"></div>\n </u-scroll>\n</template>\n\n<script lang=\"ts\" setup>\nimport { Compartment, EditorState, type Extension } from '@codemirror/state'\nimport { oneDark } from '@codemirror/theme-one-dark'\nimport { ViewPlugin, tooltips, type ViewUpdate } from '@codemirror/view'\nimport { useFormFallbackProps } from '@veltra/compositions'\nimport { bem, zIndex } from '@veltra/utils'\nimport { EditorView, basicSetup } from 'codemirror'\nimport {\n computed,\n onBeforeUnmount,\n shallowRef,\n useTemplateRef,\n watch,\n type CSSProperties\n} from 'vue'\n\nimport type { CodeEditorLang, CodeEditorProps } from '../../types'\nimport { injectFormContext } from '../../utils/form-context'\nimport { UScroll } from '../scroll'\n\ndefineOptions({ name: 'CodeEditor' })\n\nconst props = withDefaults(defineProps<CodeEditorProps>(), {\n disabled: undefined,\n readonly: undefined,\n dark: false,\n defaultLines: 8\n})\n\nconst model = defineModel<string>()\n\nconst cls = bem('code-editor')\n\nconst { formProps } = injectFormContext()\n\nconst { disabled, readonly } = useFormFallbackProps([formProps ?? {}, props], {\n disabled: false,\n readonly: false\n})\n\nconst className = computed<string[]>(() => [\n cls.b,\n bem.is('disabled', disabled.value),\n bem.is('readonly', readonly.value),\n bem.is('dark', props.dark)\n])\n\nconst rootStyle = computed<CSSProperties>(() => ({\n '--u-code-editor-default-lines': Math.max(1, props.defaultLines)\n}))\n\nconst containerRef = useTemplateRef('container')\nconst editor = shallowRef<EditorView | null>(null)\n\nconst langLoaders: Record<CodeEditorLang, () => Promise<Extension>> = {\n js: () => import('@codemirror/lang-javascript').then((m) => m.javascript({ typescript: true })),\n sql: () => import('@codemirror/lang-sql').then((m) => m.sql()),\n java: () => import('@codemirror/lang-java').then((m) => m.java()),\n json: () => import('@codemirror/lang-json').then((m) => m.json())\n}\n\nconst themeCompartment = new Compartment()\nconst editableCompartment = new Compartment()\nconst readOnlyCompartment = new Compartment()\nconst langCompartment = new Compartment()\n\nlet phantomGutter: HTMLElement | null = null\nlet phantomContainer: HTMLElement | null = null\nlet lastPhantomKey = ''\n\nfunction resetPhantomCache() {\n phantomGutter = null\n phantomContainer = null\n lastPhantomKey = ''\n}\n\n/**\n * 在 .cm-lineNumbers 末尾追加占位行号 DOM,使可视行号数量补齐到 defaultLines。\n * CodeMirror 的 lineNumbers() 仅为真实文档行渲染行号,超出部分由本逻辑补全。\n */\nfunction syncPhantomLineNumbers() {\n const view = editor.value\n if (!view) return\n\n if (!phantomGutter || !phantomGutter.isConnected) {\n phantomGutter = view.dom.querySelector<HTMLElement>('.cm-gutter.cm-lineNumbers')\n }\n if (!phantomGutter) return\n\n if (!phantomContainer) {\n phantomContainer = document.createElement('div')\n phantomContainer.className = 'cm-phantom-lines'\n }\n if (\n phantomContainer.parentElement !== phantomGutter ||\n phantomContainer !== phantomGutter.lastElementChild\n ) {\n phantomGutter.appendChild(phantomContainer)\n }\n\n const realLines = view.state.doc.lines\n const target = Math.max(0, Math.max(1, props.defaultLines) - realLines)\n const lineHeight = view.defaultLineHeight\n\n const key = `${realLines}|${target}|${lineHeight}`\n if (key === lastPhantomKey) return\n lastPhantomKey = key\n\n while (phantomContainer.children.length > target) {\n phantomContainer.lastElementChild!.remove()\n }\n while (phantomContainer.children.length < target) {\n const el = document.createElement('div')\n el.className = 'cm-gutterElement cm-gutterElement-phantom'\n phantomContainer.appendChild(el)\n }\n for (let i = 0; i < target; i++) {\n const el = phantomContainer.children[i] as HTMLElement\n const num = String(realLines + i + 1)\n if (el.textContent !== num) el.textContent = num\n if (lineHeight && el.style.height !== `${lineHeight}px`) {\n el.style.height = `${lineHeight}px`\n }\n }\n}\n\nconst phantomLineNumbersPlugin = ViewPlugin.fromClass(\n class {\n update(update: ViewUpdate) {\n if (update.docChanged || update.geometryChanged) {\n syncPhantomLineNumbers()\n }\n }\n }\n)\n\nfunction buildExtensions(): Extension[] {\n return [\n basicSetup,\n tooltips({ parent: document.body }),\n EditorView.theme({\n '.cm-tooltip': { zIndex: zIndex() }\n }),\n themeCompartment.of(props.dark ? oneDark : []),\n editableCompartment.of(EditorView.editable.of(!disabled.value)),\n readOnlyCompartment.of(EditorState.readOnly.of(readonly.value)),\n langCompartment.of([]),\n phantomLineNumbersPlugin\n ]\n}\n\nlet editorToken = 0\nlet langToken = 0\n\nasync function applyLanguage() {\n const view = editor.value\n if (!view) return\n const myToken = ++langToken\n const { language } = props\n const ext = language ? await langLoaders[language]() : []\n if (myToken !== langToken || editor.value !== view) return\n view.dispatch({ effects: langCompartment.reconfigure(ext) })\n}\n\nfunction destroyEditor() {\n ++editorToken\n ++langToken\n editor.value?.destroy()\n editor.value = null\n resetPhantomCache()\n}\n\nfunction createEditor() {\n destroyEditor()\n const myToken = ++editorToken\n const parent = containerRef.value\n if (!parent) return\n\n const view = new EditorView({\n doc: model.value,\n extensions: buildExtensions(),\n parent,\n dispatch(tr) {\n view.update([tr])\n if (tr.docChanged) {\n model.value = tr.state.doc.toString()\n }\n }\n })\n\n if (myToken !== editorToken) {\n view.destroy()\n return\n }\n\n editor.value = view\n syncPhantomLineNumbers()\n applyLanguage()\n}\n\nwatch(\n containerRef,\n (el) => {\n if (el) createEditor()\n else destroyEditor()\n },\n { immediate: true, flush: 'post' }\n)\n\nwatch(() => props.language, applyLanguage)\n\nwatch(\n () => props.dark,\n (dark) => {\n editor.value?.dispatch({\n effects: themeCompartment.reconfigure(dark ? oneDark : [])\n })\n }\n)\n\nwatch(disabled, (v) => {\n editor.value?.dispatch({\n effects: editableCompartment.reconfigure(EditorView.editable.of(!v))\n })\n})\n\nwatch(readonly, (v) => {\n editor.value?.dispatch({\n effects: readOnlyCompartment.reconfigure(EditorState.readOnly.of(v))\n })\n})\n\nwatch(() => props.defaultLines, syncPhantomLineNumbers)\n\nwatch(\n [() => props.modelValue, editor],\n ([v, e]) => {\n if (!e) return\n if (e.composing) return\n const next = v ?? ''\n if (e.state.doc.toString() === next) return\n\n const valueLength = next.length\n const inRange = e.state.selection.ranges.every(\n (range) => range.anchor <= valueLength && range.head <= valueLength\n )\n e.dispatch({\n changes: { from: 0, to: e.state.doc.length, insert: next },\n selection: inRange ? e.state.selection : { anchor: 0, head: 0 },\n scrollIntoView: true\n })\n },\n { immediate: true }\n)\n\nonBeforeUnmount(destroyEditor)\n</script>\n"],"mappings":"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"}
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
--u-code-editor-padding-block: 6px;
|
|
23
23
|
--u-code-editor-bg: var(--u-bg-color-top);
|
|
24
24
|
--u-code-editor-fg: var(--u-text-color-main);
|
|
25
|
-
--u-code-editor-border: var(--u-border-color);
|
|
25
|
+
--u-code-editor-border: var(--u-border-muted-color);
|
|
26
26
|
--u-code-editor-gutter-fg: var(--u-text-color-placeholder);
|
|
27
27
|
--u-code-editor-active-bg: rgba(30, 136, 229, 0.06);
|
|
28
28
|
--u-code-editor-selection-bg: rgba(30, 136, 229, 0.18);
|
|
@@ -44,44 +44,19 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
44
44
|
context?.toggle(props.value);
|
|
45
45
|
};
|
|
46
46
|
const wrapperEl = ref();
|
|
47
|
-
|
|
48
|
-
const cancelTransition = () => {
|
|
49
|
-
cleanupTransition?.();
|
|
50
|
-
cleanupTransition = null;
|
|
51
|
-
};
|
|
52
|
-
const animateHeight = (active) => {
|
|
53
|
-
const el = wrapperEl.value;
|
|
54
|
-
if (!el) return;
|
|
55
|
-
cancelTransition();
|
|
56
|
-
const startHeight = el.offsetHeight;
|
|
57
|
-
const endHeight = active ? el.scrollHeight : 0;
|
|
58
|
-
if (startHeight === endHeight) {
|
|
59
|
-
el.style.height = active ? "auto" : "0px";
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
el.style.height = `${startHeight}px`;
|
|
63
|
-
el.offsetHeight;
|
|
64
|
-
el.style.height = `${endHeight}px`;
|
|
65
|
-
const onEnd = (e) => {
|
|
66
|
-
if (e.target !== el || e.propertyName !== "height") return;
|
|
67
|
-
cleanup();
|
|
68
|
-
if (active) el.style.height = "auto";
|
|
69
|
-
};
|
|
70
|
-
const cleanup = () => {
|
|
71
|
-
el.removeEventListener("transitionend", onEnd);
|
|
72
|
-
el.removeEventListener("transitioncancel", onEnd);
|
|
73
|
-
cleanupTransition = null;
|
|
74
|
-
};
|
|
75
|
-
el.addEventListener("transitionend", onEnd);
|
|
76
|
-
el.addEventListener("transitioncancel", onEnd);
|
|
77
|
-
cleanupTransition = cleanup;
|
|
78
|
-
};
|
|
47
|
+
const { expandTransition } = context;
|
|
79
48
|
onMounted(() => {
|
|
80
49
|
if (!wrapperEl.value) return;
|
|
81
|
-
wrapperEl.value
|
|
50
|
+
expandTransition.setExpanded(wrapperEl.value, isActive.value);
|
|
51
|
+
});
|
|
52
|
+
watch(isActive, (active) => {
|
|
53
|
+
if (!wrapperEl.value) return;
|
|
54
|
+
active ? expandTransition.expand(wrapperEl.value) : expandTransition.collapse(wrapperEl.value);
|
|
55
|
+
});
|
|
56
|
+
onBeforeUnmount(() => {
|
|
57
|
+
if (!wrapperEl.value) return;
|
|
58
|
+
expandTransition.cancel(wrapperEl.value);
|
|
82
59
|
});
|
|
83
|
-
watch(isActive, animateHeight);
|
|
84
|
-
onBeforeUnmount(cancelTransition);
|
|
85
60
|
return (_ctx, _cache) => {
|
|
86
61
|
return openBlock(), createElementBlock("div", { class: normalizeClass(classList.value) }, [createElementVNode("div", {
|
|
87
62
|
class: normalizeClass(headerClassList.value),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collapse-item.js","names":[],"sources":["../../../src/components/collapse/collapse-item.vue"],"sourcesContent":["<template>\n <div :class=\"classList\">\n <div\n :class=\"headerClassList\"\n role=\"button\"\n :aria-expanded=\"isActive\"\n :aria-disabled=\"disabled\"\n :tabindex=\"disabled ? -1 : 0\"\n @click=\"handleClick\"\n @keydown.enter.prevent=\"handleClick\"\n @keydown.space.prevent=\"handleClick\"\n >\n <span v-if=\"showLeftIcon\" :class=\"cls.e('icon')\">\n <slot name=\"icon\" :is-active=\"isActive\">\n <UIcon><component :is=\"iconComponent\" /></UIcon>\n </slot>\n </span>\n\n <span :class=\"cls.e('title')\">\n <slot name=\"title\">{{ title }}</slot>\n </span>\n\n <span v-if=\"showRightIcon\" :class=\"cls.e('icon')\">\n <slot name=\"icon\" :is-active=\"isActive\">\n <UIcon><component :is=\"iconComponent\" /></UIcon>\n </slot>\n </span>\n </div>\n <div ref=\"wrapperEl\" :class=\"cls.e('content-wrapper')\" :aria-hidden=\"!isActive\">\n <div :class=\"cls.e('content')\">\n <slot />\n </div>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ArrowRight } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed, inject, onBeforeUnmount, onMounted, ref, watch } from 'vue'\n\nimport type { CollapseItemProps } from '../../types'\nimport { UIcon } from '../icon'\nimport { CollapseDIKey } from './di'\n\ndefineOptions({\n name: 'CollapseItem'\n})\n\nconst props = defineProps<CollapseItemProps>()\n\nconst context = inject(CollapseDIKey)
|
|
1
|
+
{"version":3,"file":"collapse-item.js","names":[],"sources":["../../../src/components/collapse/collapse-item.vue"],"sourcesContent":["<template>\n <div :class=\"classList\">\n <div\n :class=\"headerClassList\"\n role=\"button\"\n :aria-expanded=\"isActive\"\n :aria-disabled=\"disabled\"\n :tabindex=\"disabled ? -1 : 0\"\n @click=\"handleClick\"\n @keydown.enter.prevent=\"handleClick\"\n @keydown.space.prevent=\"handleClick\"\n >\n <span v-if=\"showLeftIcon\" :class=\"cls.e('icon')\">\n <slot name=\"icon\" :is-active=\"isActive\">\n <UIcon><component :is=\"iconComponent\" /></UIcon>\n </slot>\n </span>\n\n <span :class=\"cls.e('title')\">\n <slot name=\"title\">{{ title }}</slot>\n </span>\n\n <span v-if=\"showRightIcon\" :class=\"cls.e('icon')\">\n <slot name=\"icon\" :is-active=\"isActive\">\n <UIcon><component :is=\"iconComponent\" /></UIcon>\n </slot>\n </span>\n </div>\n <div ref=\"wrapperEl\" :class=\"cls.e('content-wrapper')\" :aria-hidden=\"!isActive\">\n <div :class=\"cls.e('content')\">\n <slot />\n </div>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ArrowRight } from '@veltra/icons/normal'\nimport { bem } from '@veltra/utils'\nimport { computed, inject, onBeforeUnmount, onMounted, ref, watch } from 'vue'\n\nimport type { CollapseItemProps } from '../../types'\nimport { UIcon } from '../icon'\nimport { CollapseDIKey } from './di'\n\ndefineOptions({\n name: 'CollapseItem'\n})\n\nconst props = defineProps<CollapseItemProps>()\n\nconst context = inject(CollapseDIKey)!\n\nconst cls = context?.cls ?? bem('collapse')\n\nconst isActive = computed(() => !!context?.activeValues.value.includes(props.value))\n\nconst iconPosition = computed(() => context?.iconPosition.value ?? 'right')\n\nconst iconComponent = computed(() => context?.expandIcon.value ?? ArrowRight)\n\nconst showLeftIcon = computed(() => !props.hideIcon && iconPosition.value === 'left')\nconst showRightIcon = computed(() => !props.hideIcon && iconPosition.value === 'right')\n\nconst classList = computed(() => [\n cls.e('item'),\n bem.is('active', isActive.value),\n bem.is('disabled', props.disabled)\n])\n\nconst headerClassList = computed(() => [\n cls.e('header'),\n bem.is('disabled', props.disabled),\n bem.is('active', isActive.value)\n])\n\nconst handleClick = () => {\n if (props.disabled) return\n context?.toggle(props.value)\n}\n\nconst wrapperEl = ref<HTMLElement>()\n\nconst { expandTransition } = context\n\nonMounted(() => {\n if (!wrapperEl.value) return\n expandTransition.setExpanded(wrapperEl.value, isActive.value)\n})\n\nwatch(isActive, (active) => {\n if (!wrapperEl.value) return\n active ? expandTransition.expand(wrapperEl.value) : expandTransition.collapse(wrapperEl.value)\n})\n\nonBeforeUnmount(() => {\n if (!wrapperEl.value) return\n expandTransition.cancel(wrapperEl.value)\n})\n</script>\n"],"mappings":"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"}
|