@cedar-design/ui-vue 1.1.0 → 1.1.1
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/es/_components/field-presentation/EditorPanel.vue.mjs +1 -1
- package/es/_components/field-presentation/editor-pending.mjs +4 -0
- package/es/_components/field-presentation/with-field-presentation.mjs +33 -7
- package/es/_components/picker-field/PickerField.vue.mjs +6 -12
- package/es/_components/picker-field/range-labels.mjs +16 -0
- package/es/_components/selected-options/style/index.css +33 -15
- package/es/_components/selection-field/use-selection-session.mjs +1 -0
- package/es/_components/virtual-list-v2/VirtualList2.vue.mjs +21 -3
- package/es/_utils/modal-focus.mjs +9 -2
- package/es/_utils/modal-surface.mjs +9 -3
- package/es/anchor/style/index.css +1 -1
- package/es/auto-complete/auto-complete.mjs +2 -2
- package/es/auto-complete/presentation.mjs +1 -0
- package/es/auto-complete/props.mjs +2 -0
- package/es/auto-complete/style/index.css +7 -2
- package/es/back-top/style/index.css +1 -1
- package/es/button/base.mjs +6 -0
- package/es/button/index.mjs +8 -8
- package/es/button/style/index.css +1 -1
- package/es/card/Card.vue.mjs +46 -12
- package/es/carousel/style/index.css +1 -1
- package/es/cascader/CascaderMenu.vue.mjs +2 -2
- package/es/cascader/cascader-option.mjs +11 -6
- package/es/cascader/field-adapter.mjs +1 -0
- package/es/cascader/props.mjs +2 -0
- package/es/cascader/style/index.css +36 -9
- package/es/cascader/use-cascader-focus.mjs +9 -6
- package/es/cedar.css +187 -79
- package/es/cedar.esm.js +21694 -21413
- package/es/checkbox/base.mjs +6 -0
- package/es/checkbox/checkbox-group.vue.mjs +2 -2
- package/es/checkbox/index.mjs +1 -1
- package/es/checkbox/presentation.mjs +2 -2
- package/es/checkbox/style/index.css +1 -1
- package/es/countdown/use-countdown.mjs +7 -2
- package/es/date/DatePanelActions.vue.mjs +1 -1
- package/es/date/DateShortcuts.vue.mjs +1 -1
- package/es/date/picker/panels/Footer2.vue.mjs +1 -1
- package/es/date/picker/panels/Shortcuts2.vue.mjs +1 -1
- package/es/date/picker/style/index.css +1 -1
- package/es/dialog/Dialog.vue.mjs +1 -1
- package/es/ellipsis/style/index.css +1 -1
- package/es/form/FormItem2.vue.mjs +35 -7
- package/es/form/FormItemLabel.vue.mjs +4 -3
- package/es/form/focus-explicit-label.mjs +28 -0
- package/es/form/style/index.css +1 -1
- package/es/input/base.mjs +7 -0
- package/es/input/index.mjs +16 -16
- package/es/layout/style/index.css +1 -1
- package/es/nav-menu/style/index.css +1 -1
- package/es/pagination/PageInput.vue.mjs +2 -2
- package/es/pagination/style/index.css +2 -2
- package/es/people-select/PeopleSelect.mjs +23 -50
- package/es/people-select/Person.vue.mjs +1 -1
- package/es/people-select/emits.mjs +1 -1
- package/es/people-select/people-select.mjs +6 -8
- package/es/people-select/presentation.mjs +3 -1
- package/es/people-select/props.mjs +9 -3
- package/es/people-select/selection.mjs +43 -0
- package/es/people-select/style/index.css +6 -0
- package/es/progress/style/index.css +2 -2
- package/es/radio/style/index.css +1 -1
- package/es/rate/style/index.css +1 -1
- package/es/ripple/index.mjs +57 -1
- package/es/scheduler/style/index.css +1 -1
- package/es/search/HistoryContent.vue.mjs +3 -3
- package/es/search/props.mjs +0 -1
- package/es/search/search.vue.mjs +1 -1
- package/es/select/props.mjs +2 -0
- package/es/select/select.mjs +10 -4
- package/es/select/style/index.css +22 -12
- package/es/select/use-select-controller.mjs +14 -2
- package/es/slider/Slider.vue.mjs +39 -21
- package/es/slider/SliderInput.vue.mjs +4 -2
- package/es/slider/style/index.css +2 -2
- package/es/steps/style/index.css +10 -10
- package/es/switch/Switch.vue.mjs +6 -1
- package/es/switch/style/index.css +1 -1
- package/es/table/structural-slot.mjs +17 -0
- package/es/table/style/index.css +2 -2
- package/es/table/table-tbody.mjs +2 -1
- package/es/table/table-td.mjs +3 -2
- package/es/table/table-th.mjs +3 -2
- package/es/table/table-thead.mjs +2 -1
- package/es/table/table-tr.mjs +3 -2
- package/es/table/table.mjs +22 -5
- package/es/tabs/style/index.css +1 -1
- package/es/time/picker/Panel2.vue.mjs +1 -1
- package/es/time/picker/RangePanel2.vue.mjs +1 -1
- package/es/tree/style/index.css +1 -1
- package/es/tree-select/panel.mjs +3 -1
- package/es/tree-select/presentation.mjs +1 -0
- package/es/tree-select/props.mjs +2 -0
- package/es/tree-select/style/index.css +49 -7
- package/es/trigger/interaction.mjs +1 -1
- package/es/trigger/popup-move-focus.mjs +6 -6
- package/es/trigger/position.mjs +41 -3
- package/es/trigger/positioner.mjs +28 -5
- package/es/trigger/trigger.mjs +1 -1
- package/es/upload/composables/use-upload-queue.mjs +9 -1
- package/es/upload/composables/use-uploader.mjs +31 -11
- package/es/upload/upload.vue.mjs +10 -2
- package/lib/_components/field-presentation/EditorPanel.vue.js +3 -3
- package/lib/_components/field-presentation/editor-pending.js +4 -0
- package/lib/_components/field-presentation/with-field-presentation.js +32 -6
- package/lib/_components/picker-field/PickerField.vue.js +6 -12
- package/lib/_components/picker-field/range-labels.js +16 -0
- package/lib/_components/selected-options/style/index.css +33 -15
- package/lib/_components/selection-field/use-selection-session.js +1 -0
- package/lib/_components/virtual-list-v2/VirtualList2.vue.js +20 -2
- package/lib/_utils/modal-focus.js +9 -2
- package/lib/_utils/modal-surface.js +9 -3
- package/lib/anchor/style/index.css +1 -1
- package/lib/auto-complete/auto-complete.js +2 -2
- package/lib/auto-complete/presentation.js +1 -0
- package/lib/auto-complete/props.js +2 -0
- package/lib/auto-complete/style/index.css +7 -2
- package/lib/back-top/style/index.css +1 -1
- package/lib/button/base.js +6 -0
- package/lib/button/index.js +4 -4
- package/lib/button/style/index.css +1 -1
- package/lib/card/Card.vue.js +47 -13
- package/lib/carousel/style/index.css +1 -1
- package/lib/cascader/CascaderMenu.vue.js +2 -2
- package/lib/cascader/cascader-option.js +11 -6
- package/lib/cascader/field-adapter.js +1 -0
- package/lib/cascader/props.js +2 -0
- package/lib/cascader/style/index.css +36 -9
- package/lib/cascader/use-cascader-focus.js +9 -6
- package/lib/cedar.cjs.js +1149 -738
- package/lib/cedar.css +187 -79
- package/lib/checkbox/base.js +6 -0
- package/lib/checkbox/index.js +4 -4
- package/lib/checkbox/presentation.js +2 -2
- package/lib/checkbox/style/index.css +1 -1
- package/lib/countdown/use-countdown.js +7 -2
- package/lib/date/DatePanelActions.vue.js +3 -3
- package/lib/date/DateShortcuts.vue.js +2 -2
- package/lib/date/picker/panels/Footer2.vue.js +2 -2
- package/lib/date/picker/panels/Shortcuts2.vue.js +2 -2
- package/lib/date/picker/style/index.css +1 -1
- package/lib/dialog/Dialog.vue.js +3 -3
- package/lib/ellipsis/style/index.css +1 -1
- package/lib/form/FormItem2.vue.js +35 -7
- package/lib/form/FormItemLabel.vue.js +3 -2
- package/lib/form/focus-explicit-label.js +28 -0
- package/lib/form/style/index.css +1 -1
- package/lib/input/base.js +7 -0
- package/lib/input/index.js +4 -4
- package/lib/layout/style/index.css +1 -1
- package/lib/nav-menu/style/index.css +1 -1
- package/lib/pagination/PageInput.vue.js +2 -2
- package/lib/pagination/style/index.css +2 -2
- package/lib/people-select/PeopleSelect.js +22 -49
- package/lib/people-select/Person.vue.js +3 -3
- package/lib/people-select/emits.js +1 -1
- package/lib/people-select/people-select.js +6 -8
- package/lib/people-select/presentation.js +3 -1
- package/lib/people-select/props.js +9 -3
- package/lib/people-select/selection.js +43 -0
- package/lib/people-select/style/index.css +6 -0
- package/lib/progress/style/index.css +2 -2
- package/lib/radio/style/index.css +1 -1
- package/lib/rate/style/index.css +1 -1
- package/lib/ripple/index.js +57 -1
- package/lib/scheduler/style/index.css +1 -1
- package/lib/search/HistoryContent.vue.js +4 -4
- package/lib/search/props.js +0 -1
- package/lib/search/search.vue.js +2 -2
- package/lib/select/props.js +2 -0
- package/lib/select/select.js +10 -4
- package/lib/select/style/index.css +22 -12
- package/lib/select/use-select-controller.js +14 -2
- package/lib/slider/Slider.vue.js +38 -20
- package/lib/slider/SliderInput.vue.js +4 -2
- package/lib/slider/style/index.css +2 -2
- package/lib/steps/style/index.css +10 -10
- package/lib/switch/Switch.vue.js +5 -0
- package/lib/switch/style/index.css +1 -1
- package/lib/table/structural-slot.js +17 -0
- package/lib/table/style/index.css +2 -2
- package/lib/table/table-tbody.js +2 -1
- package/lib/table/table-td.js +3 -2
- package/lib/table/table-th.js +3 -2
- package/lib/table/table-thead.js +2 -1
- package/lib/table/table-tr.js +3 -2
- package/lib/table/table.js +21 -4
- package/lib/tabs/style/index.css +1 -1
- package/lib/time/picker/Panel2.vue.js +2 -2
- package/lib/time/picker/RangePanel2.vue.js +2 -2
- package/lib/tree/style/index.css +1 -1
- package/lib/tree-select/panel.js +3 -1
- package/lib/tree-select/presentation.js +1 -0
- package/lib/tree-select/props.js +2 -0
- package/lib/tree-select/style/index.css +49 -7
- package/lib/trigger/popup-move-focus.js +6 -6
- package/lib/trigger/position.js +40 -2
- package/lib/trigger/positioner.js +27 -4
- package/lib/trigger/trigger.js +1 -1
- package/lib/upload/composables/use-upload-queue.js +9 -1
- package/lib/upload/composables/use-uploader.js +31 -11
- package/lib/upload/upload.vue.js +9 -1
- package/package.json +6 -6
- package/types/_components/field-presentation/editor-pending.d.ts +3 -0
- package/types/_components/field-presentation/with-field-presentation.d.ts +2 -0
- package/types/_components/picker-field/range-labels.d.ts +1 -0
- package/types/_utils/modal-focus.d.ts +1 -0
- package/types/auto-complete/auto-complete.d.ts +9 -0
- package/types/auto-complete/index.d.ts +30 -0
- package/types/auto-complete/presentation.d.ts +9 -0
- package/types/auto-complete/props.d.ts +5 -0
- package/types/button/base.d.ts +266 -0
- package/types/button/index.d.ts +5 -1
- package/types/cascader/Cascader.vue.d.ts +9 -0
- package/types/cascader/index.d.ts +30 -0
- package/types/cascader/presentation.d.ts +15 -0
- package/types/cascader/props.d.ts +5 -0
- package/types/cascader/use-cascader-controller.d.ts +4 -0
- package/types/checkbox/base.d.ts +361 -0
- package/types/checkbox/index.d.ts +5 -1
- package/types/date/picker/DateRangePicker.vue.d.ts +12 -496
- package/types/date/picker/DateRangePickerPanel.vue.d.ts +12 -496
- package/types/date/picker/Picker.vue.d.ts +12 -496
- package/types/date/picker/PickerPanel.vue.d.ts +12 -496
- package/types/date/picker/panels/Footer.vue.d.ts +3 -124
- package/types/date/picker/panels/Shortcuts.vue.d.ts +3 -124
- package/types/date/picker/panels/date/Index.vue.d.ts +3 -124
- package/types/date/picker/panels/week/Index.vue.d.ts +3 -124
- package/types/form/FormItemLabel.vue.d.ts +2 -2
- package/types/form/context.d.ts +1 -1
- package/types/form/focus-explicit-label.d.ts +2 -0
- package/types/input/base.d.ts +481 -0
- package/types/input/index.d.ts +5 -1
- package/types/people-select/PeopleSelect.d.ts +38 -16
- package/types/people-select/emits.d.ts +3 -2
- package/types/people-select/index.d.ts +135 -63
- package/types/people-select/people-select.d.ts +47 -16
- package/types/people-select/presentation.d.ts +46 -16
- package/types/people-select/props.d.ts +17 -6
- package/types/people-select/selection.d.ts +11 -0
- package/types/people-select/types.d.ts +5 -1
- package/types/popconfirm/Popconfirm.vue.d.ts +2 -0
- package/types/popconfirm/index.d.ts +8 -0
- package/types/select/index.d.ts +30 -0
- package/types/select/native-editor-owner.d.ts +1 -0
- package/types/select/props.d.ts +5 -0
- package/types/select/select.d.ts +9 -0
- package/types/select/use-select-controller.d.ts +5 -0
- package/types/slider/SliderInput.vue.d.ts +4 -0
- package/types/table/structural-slot.d.ts +3 -0
- package/types/table/table-operation-td.d.ts +2 -0
- package/types/time/picker/Panel.vue.d.ts +3 -124
- package/types/time/picker/RangePanel.vue.d.ts +6 -248
- package/types/time/presentation/TimePanelContent.vue.d.ts +9 -372
- package/types/transfer/Transfer.vue.d.ts +4 -0
- package/types/transfer/TransferView.vue.d.ts +2 -0
- package/types/transfer/index.d.ts +16 -0
- package/types/transfer/presentation.d.ts +4 -0
- package/types/tree/BaseNode.vue.d.ts +2 -0
- package/types/tree/TransitionNodeList.vue.d.ts +2 -0
- package/types/tree-select/TreeSelect.vue.d.ts +13 -0
- package/types/tree-select/index.d.ts +50 -0
- package/types/tree-select/presentation.d.ts +13 -0
- package/types/tree-select/props.d.ts +5 -0
- package/types/trigger/position.d.ts +1 -0
- package/types/typography/EditContent.vue.d.ts +6 -0
- package/types/upload/composables/use-upload-queue.d.ts +1 -0
- package/types/upload/composables/use-uploader.d.ts +2 -0
- package/types/upload/upload.vue.d.ts +3 -3
- package/umd/_components/selected-options/style/index.css +33 -15
- package/umd/anchor/style/index.css +1 -1
- package/umd/auto-complete/style/index.css +7 -2
- package/umd/back-top/style/index.css +1 -1
- package/umd/button/style/index.css +1 -1
- package/umd/carousel/style/index.css +1 -1
- package/umd/cascader/style/index.css +36 -9
- package/umd/cedar.css +187 -79
- package/umd/cedar.js +6 -6
- package/umd/checkbox/style/index.css +1 -1
- package/umd/date/picker/style/index.css +1 -1
- package/umd/ellipsis/style/index.css +1 -1
- package/umd/form/style/index.css +1 -1
- package/umd/layout/style/index.css +1 -1
- package/umd/nav-menu/style/index.css +1 -1
- package/umd/pagination/style/index.css +2 -2
- package/umd/people-select/style/index.css +6 -0
- package/umd/progress/style/index.css +2 -2
- package/umd/radio/style/index.css +1 -1
- package/umd/rate/style/index.css +1 -1
- package/umd/scheduler/style/index.css +1 -1
- package/umd/select/style/index.css +22 -12
- package/umd/slider/style/index.css +2 -2
- package/umd/steps/style/index.css +10 -10
- package/umd/switch/style/index.css +1 -1
- package/umd/table/style/index.css +2 -2
- package/umd/tabs/style/index.css +1 -1
- package/umd/tree/style/index.css +1 -1
- package/umd/tree-select/style/index.css +49 -7
package/es/card/Card.vue.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { defineComponent, computed, ref, shallowRef, watch, nextTick, onBeforeUnmount, onDeactivated, onActivated, withDirectives, openBlock, createElementBlock, normalizeStyle, unref, normalizeClass, createElementVNode, renderSlot, createCommentVNode, toDisplayString, createBlock, createVNode, withModifiers, withCtx } from "vue";
|
|
2
2
|
import { IconClose } from "@cedar-design/icons-vue";
|
|
3
3
|
import { getRect, doubleRaf } from "@cedar-design/shared-vue";
|
|
4
|
-
import
|
|
4
|
+
import Button from "../button/base.mjs";
|
|
5
5
|
import { useLock } from "../context/lock.mjs";
|
|
6
6
|
import { useZIndex } from "../context/zIndex.mjs";
|
|
7
7
|
import { Icon } from "../icon/index.mjs";
|
|
@@ -60,25 +60,25 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
60
60
|
let stopInactiveFocusTracking;
|
|
61
61
|
function trackInactiveFocus() {
|
|
62
62
|
stopInactiveFocusTracking?.();
|
|
63
|
-
const
|
|
64
|
-
if (!
|
|
63
|
+
const document2 = card.value?.ownerDocument;
|
|
64
|
+
if (!document2) return;
|
|
65
65
|
const remember = (target) => {
|
|
66
66
|
const element = target;
|
|
67
|
-
if (element && typeof element.focus === "function" && !card.value?.contains(element) && element !==
|
|
67
|
+
if (element && typeof element.focus === "function" && !card.value?.contains(element) && element !== document2.body && element !== document2.documentElement) {
|
|
68
68
|
returnFocus = element;
|
|
69
69
|
}
|
|
70
70
|
};
|
|
71
|
-
remember(
|
|
71
|
+
remember(document2.activeElement);
|
|
72
72
|
const onFocus = (event) => remember(event.target);
|
|
73
|
-
|
|
74
|
-
stopInactiveFocusTracking = () =>
|
|
73
|
+
document2.addEventListener("focusin", onFocus, true);
|
|
74
|
+
stopInactiveFocusTracking = () => document2.removeEventListener("focusin", onFocus, true);
|
|
75
75
|
}
|
|
76
76
|
function updateReturnFocus(open) {
|
|
77
|
-
const
|
|
78
|
-
if (!
|
|
79
|
-
const focused =
|
|
77
|
+
const document2 = card.value?.ownerDocument;
|
|
78
|
+
if (!document2) return;
|
|
79
|
+
const focused = document2.activeElement;
|
|
80
80
|
if (open) {
|
|
81
|
-
returnFocus = focused && focused !==
|
|
81
|
+
returnFocus = focused && focused !== document2.body && focused !== document2.documentElement ? focused : null;
|
|
82
82
|
return;
|
|
83
83
|
}
|
|
84
84
|
const target = returnFocus;
|
|
@@ -92,6 +92,29 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
92
92
|
const { onStackTop } = usePopupLayer(wantsFloating, zIndex, () => card.value?.ownerDocument, true);
|
|
93
93
|
const available = () => active && !disposed;
|
|
94
94
|
let openingWaiting = false;
|
|
95
|
+
let cancelOpeningFrames;
|
|
96
|
+
function waitForOwnerFrames(view) {
|
|
97
|
+
cancelOpeningFrames?.();
|
|
98
|
+
return new Promise((resolve) => {
|
|
99
|
+
let handle;
|
|
100
|
+
let settled = false;
|
|
101
|
+
const finish = (completed) => {
|
|
102
|
+
if (settled) return;
|
|
103
|
+
settled = true;
|
|
104
|
+
if (cancelOpeningFrames === cancel) cancelOpeningFrames = void 0;
|
|
105
|
+
resolve(completed);
|
|
106
|
+
};
|
|
107
|
+
const cancel = () => {
|
|
108
|
+
if (handle !== void 0) view.cancelAnimationFrame?.(handle);
|
|
109
|
+
finish(false);
|
|
110
|
+
};
|
|
111
|
+
cancelOpeningFrames = cancel;
|
|
112
|
+
handle = view.requestAnimationFrame(() => {
|
|
113
|
+
if (settled) return;
|
|
114
|
+
handle = view.requestAnimationFrame(() => finish(true));
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
}
|
|
95
118
|
let reducedMotion = false;
|
|
96
119
|
let stopMotionTracking;
|
|
97
120
|
function trackMotion(element) {
|
|
@@ -127,6 +150,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
127
150
|
wantsFloating,
|
|
128
151
|
(value) => {
|
|
129
152
|
const token = ++generation;
|
|
153
|
+
cancelOpeningFrames?.();
|
|
130
154
|
if (!active) {
|
|
131
155
|
if (!disposed && value) trackInactiveFocus();
|
|
132
156
|
else {
|
|
@@ -157,6 +181,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
157
181
|
return;
|
|
158
182
|
}
|
|
159
183
|
const token = ++generation;
|
|
184
|
+
cancelOpeningFrames?.();
|
|
160
185
|
const element = card.value;
|
|
161
186
|
let consumed = false;
|
|
162
187
|
clearTimeout(floater.value ?? void 0);
|
|
@@ -183,7 +208,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
183
208
|
dropdownFloaterTop = floaterTop.value;
|
|
184
209
|
dropdownFloaterLeft = floaterLeft.value;
|
|
185
210
|
showFloatingButtons.value = true;
|
|
186
|
-
if (!reducedMotion)
|
|
211
|
+
if (!reducedMotion) {
|
|
212
|
+
const view = element.ownerDocument.defaultView;
|
|
213
|
+
if (view && typeof document !== "undefined" && element.ownerDocument !== document && typeof view.requestAnimationFrame === "function") {
|
|
214
|
+
if (!await waitForOwnerFrames(view)) return;
|
|
215
|
+
} else {
|
|
216
|
+
await doubleRaf();
|
|
217
|
+
}
|
|
218
|
+
}
|
|
187
219
|
if (!current(token, element) || !wantsFloating()) {
|
|
188
220
|
return;
|
|
189
221
|
}
|
|
@@ -205,6 +237,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
205
237
|
return;
|
|
206
238
|
}
|
|
207
239
|
const token = ++generation;
|
|
240
|
+
cancelOpeningFrames?.();
|
|
208
241
|
const element = card.value;
|
|
209
242
|
let consumed = false;
|
|
210
243
|
clearTimeout(dropper);
|
|
@@ -293,6 +326,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
293
326
|
}
|
|
294
327
|
});
|
|
295
328
|
function cleanup() {
|
|
329
|
+
cancelOpeningFrames?.();
|
|
296
330
|
openingWaiting = false;
|
|
297
331
|
active = false;
|
|
298
332
|
generation++;
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
--c-carousel-card-opacity: 0.6;
|
|
29
29
|
--c-carousel-focus-width: 2px;
|
|
30
30
|
--c-carousel-focus-offset: 2px;
|
|
31
|
-
--c-carousel-focus-color: var(--c-sys-color-
|
|
31
|
+
--c-carousel-focus-color: var(--c-sys-color-action-primary);
|
|
32
32
|
}
|
|
33
33
|
.c-carousel {
|
|
34
34
|
position: relative;
|
|
@@ -4,7 +4,7 @@ import { isolateEditorForm } from "../_components/field-presentation/form-bridge
|
|
|
4
4
|
import { provideFormErrorDescriptionBoundary } from "../form/error-description.mjs";
|
|
5
5
|
import { selectionEditorSurface } from "../_components/selected-options/context.mjs";
|
|
6
6
|
import _sfc_main$1 from "../_components/selected-options/SelectedOptions.vue.mjs";
|
|
7
|
-
import
|
|
7
|
+
import SearchInput from "../input/base.mjs";
|
|
8
8
|
import { createNamespace } from "../_utils/global-config.mjs";
|
|
9
9
|
import BaseCascaderPanel from "./base-cascader-panel.mjs";
|
|
10
10
|
import CascaderSearchPanel from "./cascader-search-panel.mjs";
|
|
@@ -44,7 +44,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
44
44
|
onClear: __props.controller.clearSelection
|
|
45
45
|
}, {
|
|
46
46
|
default: withCtx(() => [
|
|
47
|
-
__props.searchable ? (openBlock(), createBlock(unref(
|
|
47
|
+
__props.searchable ? (openBlock(), createBlock(unref(SearchInput), {
|
|
48
48
|
key: 0,
|
|
49
49
|
"model-value": __props.controller.computedInputValue,
|
|
50
50
|
"edit-mode": "direct",
|
|
@@ -2,10 +2,12 @@ import { defineComponent, inject, useId, ref, computed, onDeactivated, onBeforeU
|
|
|
2
2
|
import { IconCheck, IconLoading, IconRight } from "@cedar-design/icons-vue";
|
|
3
3
|
import { isolateEditorForm } from "../_components/field-presentation/form-bridge.mjs";
|
|
4
4
|
import { isFunction } from "../_utils/is.mjs";
|
|
5
|
-
import
|
|
5
|
+
import _Checkbox from "../checkbox/base.mjs";
|
|
6
6
|
import { getPrefixCls, createNamespace } from "../_utils/global-config.mjs";
|
|
7
7
|
import { cascaderInjectionKey } from "./context.mjs";
|
|
8
8
|
import { getCheckedStatus, getOptionLabel } from "./utils.mjs";
|
|
9
|
+
const INTERACTIVE_ROLES = /* @__PURE__ */ new Set(["button", "link", "checkbox", "radio", "switch", "textbox", "combobox", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "treeitem", "gridcell", "slider", "spinbutton", "tab"]);
|
|
10
|
+
const CONCRETE_ROLES = new Set("alert alertdialog application article banner blockquote button caption cell checkbox code columnheader combobox comment complementary contentinfo definition deletion directory document emphasis feed figure form generic grid gridcell group heading image img insertion link list listbox listitem log main mark marquee math menu menubar menuitem menuitemcheckbox menuitemradio meter navigation none note option paragraph presentation progressbar radio radiogroup region row rowgroup rowheader scrollbar search searchbox sectionfooter sectionheader separator slider spinbutton status strong suggestion subscript superscript switch tab table tablist tabpanel term textbox time timer toolbar tooltip tree treegrid treeitem doc-abstract doc-acknowledgments doc-afterword doc-appendix doc-backlink doc-biblioentry doc-bibliography doc-biblioref doc-chapter doc-colophon doc-conclusion doc-cover doc-credit doc-credits doc-dedication doc-endnote doc-endnotes doc-epigraph doc-epilogue doc-errata doc-example doc-footnote doc-foreword doc-glossary doc-glossref doc-index doc-introduction doc-noteref doc-notice doc-pagebreak doc-pagefooter doc-pageheader doc-pagelist doc-part doc-preface doc-prologue doc-pullquote doc-qna doc-subtitle doc-tip doc-toc graphics-document graphics-object graphics-symbol".split(" "));
|
|
9
11
|
function ownsOptionClick(event) {
|
|
10
12
|
if (event.defaultPrevented) return false;
|
|
11
13
|
const boundary = event.currentTarget;
|
|
@@ -23,7 +25,10 @@ function ownsOptionClick(event) {
|
|
|
23
25
|
if (item === boundary) break;
|
|
24
26
|
const element = item;
|
|
25
27
|
if (element?.nodeType !== 1 || typeof element.matches !== "function") continue;
|
|
26
|
-
|
|
28
|
+
const primaryRole = element.getAttribute("role")?.trim().split(/\s+/).find((role) => CONCRETE_ROLES.has(role));
|
|
29
|
+
if (primaryRole && INTERACTIVE_ROLES.has(primaryRole)) return false;
|
|
30
|
+
if (element.hasAttribute("tabindex") && element.tabIndex >= 0) return false;
|
|
31
|
+
if (element.matches('li[data-cascader-key], button, a[href], input, select, textarea, summary, audio[controls], video[controls], [contenteditable]:not([contenteditable="false"])')) return false;
|
|
27
32
|
if (element.matches("label") && (element.htmlFor || element.querySelector("input, button, select, textarea"))) return false;
|
|
28
33
|
}
|
|
29
34
|
return true;
|
|
@@ -88,7 +93,9 @@ const CascaderOption = /* @__PURE__ */ defineComponent({
|
|
|
88
93
|
},
|
|
89
94
|
onMouseleave: (event) => {
|
|
90
95
|
const element = event.currentTarget;
|
|
91
|
-
const
|
|
96
|
+
const nodeRoot = element.getRootNode();
|
|
97
|
+
const focusRoot = "activeElement" in nodeRoot ? nodeRoot : element.ownerDocument;
|
|
98
|
+
const focused = focusRoot.activeElement;
|
|
92
99
|
let focusedOption = focused?.closest("[data-cascader-key]");
|
|
93
100
|
const panelSelector = `.${getPrefixCls("cascader")}-panel, .${getPrefixCls("cascader")}-editor-panel`;
|
|
94
101
|
const panel = element.closest(panelSelector);
|
|
@@ -169,7 +176,7 @@ const CascaderOption = /* @__PURE__ */ defineComponent({
|
|
|
169
176
|
}, events), [props.multiple && createVNode("span", {
|
|
170
177
|
"class": `${prefixCls}-checkbox`,
|
|
171
178
|
"onClick": (event) => event.stopPropagation()
|
|
172
|
-
}, [createVNode(
|
|
179
|
+
}, [createVNode(_Checkbox, {
|
|
173
180
|
"editMode": "direct",
|
|
174
181
|
"uninjectGroupContext": true,
|
|
175
182
|
"modelValue": Boolean(checkedStatus.value.checked),
|
|
@@ -181,9 +188,7 @@ const CascaderOption = /* @__PURE__ */ defineComponent({
|
|
|
181
188
|
if (props.option.disabled || props.option.selectionDisabled) {
|
|
182
189
|
return;
|
|
183
190
|
}
|
|
184
|
-
const task = handlePathChange(new Event("change"));
|
|
185
191
|
cascaderCtx.onClickOption?.(props.option, Boolean(checked));
|
|
186
|
-
return task;
|
|
187
192
|
}
|
|
188
193
|
}, null)]), createVNode("div", {
|
|
189
194
|
"class": `${prefixCls}-label`
|
|
@@ -2,6 +2,7 @@ import { h } from "vue";
|
|
|
2
2
|
import { optionValueText } from "../_components/field-presentation/option-labels.mjs";
|
|
3
3
|
import _sfc_main from "./CascaderEditor.vue.mjs";
|
|
4
4
|
const cascaderFieldAdapter = {
|
|
5
|
+
selectionConfirmation: "update",
|
|
5
6
|
pauseSelectionWhileLoading: true,
|
|
6
7
|
methods: ["focus", "blur", "refresh"],
|
|
7
8
|
text: (value, props) => optionValueText(value, { ...props, showPathLabel: true }),
|
package/es/cascader/props.mjs
CHANGED
|
@@ -7,6 +7,8 @@ import { formControlVariants } from "../_utils/form-control.mjs";
|
|
|
7
7
|
import { popupContainerProp } from "../_utils/popup-container.mjs";
|
|
8
8
|
const cascaderProps = {
|
|
9
9
|
...fieldLoadingProps,
|
|
10
|
+
/** 弹出编辑是否需要确认;未设置时单选即提交,多选保留确认。 */
|
|
11
|
+
needConfirm: { type: Boolean, default: void 0 },
|
|
10
12
|
openTriggerTarget: openTriggerTargetProp,
|
|
11
13
|
/** 内置本地过滤是否区分大小写;自定义过滤函数优先。 */
|
|
12
14
|
caseSensitive: { type: Boolean, default: false },
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
--c-cascader-size-item-height: 36px;
|
|
12
12
|
--c-cascader-font-item-size: var(--c-sys-font-size-md);
|
|
13
13
|
--c-cascader-margin-item-icon-left: var(--c-sys-space-5);
|
|
14
|
-
--c-cascader-item-check-color: var(--c-sys-color-
|
|
14
|
+
--c-cascader-item-check-color: var(--c-sys-color-action-primary);
|
|
15
15
|
--c-cascader-item-check-size: var(--c-sys-font-size-md);
|
|
16
16
|
--c-cascader-item-text-color: var(--c-sys-color-content-primary);
|
|
17
17
|
--c-cascader-item-icon-color: var(--c-sys-color-content-secondary);
|
|
@@ -19,11 +19,11 @@
|
|
|
19
19
|
--c-cascader-padding-item-right: var(--c-sys-space-5);
|
|
20
20
|
--c-cascader-size-item-icon: 12px;
|
|
21
21
|
--c-cascader-item-text-color-hover: var(--c-cascader-item-text-color);
|
|
22
|
-
--c-cascader-item-text-color-active: var(--c-
|
|
22
|
+
--c-cascader-item-text-color-active: var(--c-sys-color-action-primary);
|
|
23
23
|
--c-cascader-item-text-color-disabled: var(--c-sys-color-content-disabled);
|
|
24
24
|
--c-cascader-item-text-color-disabled-active: var(--c-sys-color-content-disabled);
|
|
25
|
-
--c-cascader-item-bg-active:
|
|
26
|
-
--c-cascader-item-bg-hover: var(--c-
|
|
25
|
+
--c-cascader-item-bg-active: transparent;
|
|
26
|
+
--c-cascader-item-bg-hover: var(--c-color-fill-2);
|
|
27
27
|
--c-cascader-item-bg-disabled: transparent;
|
|
28
28
|
--c-cascader-item-bg-disabled-active: var(--c-color-fill-2);
|
|
29
29
|
--c-cascader-checkbox-bg-hover: var(--c-color-fill-3);
|
|
@@ -222,17 +222,44 @@
|
|
|
222
222
|
.c-cascader-search-option-disabled:hover .c-cascader-option-check {
|
|
223
223
|
color: var(--c-cascader-item-text-color-disabled);
|
|
224
224
|
}
|
|
225
|
-
.c-cascader-option-active
|
|
226
|
-
|
|
227
|
-
|
|
225
|
+
.c-cascader-option-active,
|
|
226
|
+
.c-cascader-search-option-active {
|
|
227
|
+
color: var(--c-cascader-item-text-color-hover);
|
|
228
|
+
background-color: var(--c-cascader-item-bg-hover);
|
|
228
229
|
transition: all var(--c-sys-motion-duration-standard) var(--c-sys-motion-easing-standard);
|
|
229
230
|
}
|
|
230
|
-
.c-cascader-option-
|
|
231
|
+
.c-cascader-option-selected,
|
|
232
|
+
.c-cascader-search-option-selected {
|
|
231
233
|
color: var(--c-cascader-item-text-color-active);
|
|
232
234
|
background-color: var(--c-cascader-item-bg-active);
|
|
233
235
|
}
|
|
236
|
+
.c-cascader-option-selected:hover,
|
|
237
|
+
.c-cascader-search-option-selected:hover,
|
|
238
|
+
.c-cascader-option-selected.c-cascader-option-active,
|
|
239
|
+
.c-cascader-search-option-selected.c-cascader-option-active,
|
|
240
|
+
.c-cascader-option-selected.c-cascader-search-option-active,
|
|
241
|
+
.c-cascader-search-option-selected.c-cascader-search-option-active,
|
|
242
|
+
.c-cascader-option-selected.c-cascader-search-option-hover,
|
|
243
|
+
.c-cascader-search-option-selected.c-cascader-search-option-hover {
|
|
244
|
+
color: var(--c-cascader-item-text-color-active);
|
|
245
|
+
background-color: var(--c-cascader-item-bg-hover);
|
|
246
|
+
}
|
|
234
247
|
.c-cascader-option-active.c-cascader-option-disabled,
|
|
235
|
-
.c-cascader-option-active.c-cascader-option-disabled
|
|
248
|
+
.c-cascader-option-active.c-cascader-search-option-disabled,
|
|
249
|
+
.c-cascader-search-option-active.c-cascader-option-disabled,
|
|
250
|
+
.c-cascader-search-option-active.c-cascader-search-option-disabled,
|
|
251
|
+
.c-cascader-option-active.c-cascader-option-disabled:hover,
|
|
252
|
+
.c-cascader-option-active.c-cascader-search-option-disabled:hover,
|
|
253
|
+
.c-cascader-search-option-active.c-cascader-option-disabled:hover,
|
|
254
|
+
.c-cascader-search-option-active.c-cascader-search-option-disabled:hover,
|
|
255
|
+
.c-cascader-option-selected.c-cascader-option-disabled,
|
|
256
|
+
.c-cascader-option-selected.c-cascader-search-option-disabled,
|
|
257
|
+
.c-cascader-search-option-selected.c-cascader-option-disabled,
|
|
258
|
+
.c-cascader-search-option-selected.c-cascader-search-option-disabled,
|
|
259
|
+
.c-cascader-option-selected.c-cascader-option-disabled:hover,
|
|
260
|
+
.c-cascader-option-selected.c-cascader-search-option-disabled:hover,
|
|
261
|
+
.c-cascader-search-option-selected.c-cascader-option-disabled:hover,
|
|
262
|
+
.c-cascader-search-option-selected.c-cascader-search-option-disabled:hover {
|
|
236
263
|
color: var(--c-cascader-item-text-color-disabled-active);
|
|
237
264
|
background-color: var(--c-cascader-item-bg-disabled-active);
|
|
238
265
|
}
|
|
@@ -6,9 +6,11 @@ function useCascaderFocus(activeKey) {
|
|
|
6
6
|
onBeforeUnmount(() => cancelPendingFocus?.());
|
|
7
7
|
return (root, option, originPanel, panelSelector) => {
|
|
8
8
|
const key = activeKey.value;
|
|
9
|
-
if (!key || !root.contains(option) || root.ownerDocument.activeElement !== option) return;
|
|
10
|
-
cancelPendingFocus?.();
|
|
11
9
|
const document = root.ownerDocument;
|
|
10
|
+
const nodeRoot = root.getRootNode();
|
|
11
|
+
const focusRoot = "activeElement" in nodeRoot ? nodeRoot : document;
|
|
12
|
+
if (!key || !root.contains(option) || focusRoot.activeElement !== option) return;
|
|
13
|
+
cancelPendingFocus?.();
|
|
12
14
|
const view = document.defaultView;
|
|
13
15
|
if (!view) return;
|
|
14
16
|
let observer;
|
|
@@ -24,13 +26,14 @@ function useCascaderFocus(activeKey) {
|
|
|
24
26
|
if (cancelPendingFocus === cleanup) cancelPendingFocus = void 0;
|
|
25
27
|
};
|
|
26
28
|
const onFocus = (next) => {
|
|
27
|
-
if (next.target !== option) cleanup();
|
|
29
|
+
if (next.target !== option && !next.composedPath().includes(option)) cleanup();
|
|
28
30
|
};
|
|
29
31
|
const attempt = () => {
|
|
30
32
|
if (done) return;
|
|
31
|
-
const focused =
|
|
32
|
-
const
|
|
33
|
-
|
|
33
|
+
const focused = focusRoot.activeElement;
|
|
34
|
+
const docFocus = document.activeElement;
|
|
35
|
+
const lostToRemoval = !option.isConnected && (docFocus === document.body || docFocus === document.documentElement) && (focused === null || focused === document.body || focused === document.documentElement);
|
|
36
|
+
if (!root.isConnected || root.getRootNode() !== nodeRoot || activeKey.value !== key || focused !== option && !lostToRemoval) {
|
|
34
37
|
cleanup();
|
|
35
38
|
return;
|
|
36
39
|
}
|