d1dbe8895e6b784b65d3c4fffeb09a4b1c0269c3317abbbb8a0ded43a3361a2de8c3c1d7a7a36b2d5a4484731f360cc4f371a14dbda8395dc3014c3a554582 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. 'use strict';
  2. Object.defineProperty(exports, '__esModule', { value: true });
  3. var vue = require('vue');
  4. var lodashUnified = require('lodash-unified');
  5. var index$8 = require('../../icon/index.js');
  6. var core = require('@vueuse/core');
  7. var index$4 = require('../../tooltip/index.js');
  8. var index$6 = require('../../button/index.js');
  9. var iconsVue = require('@element-plus/icons-vue');
  10. var colorPicker = require('./color-picker.js');
  11. var index$5 = require('../../color-picker-panel/index.js');
  12. var color = require('../../color-picker-panel/src/utils/color.js');
  13. var useCommonColor = require('../../color-picker-panel/src/composables/use-common-color.js');
  14. var pluginVue_exportHelper = require('../../../_virtual/plugin-vue_export-helper.js');
  15. var colorPickerPanel = require('../../color-picker-panel/src/color-picker-panel.js');
  16. var index$7 = require('../../../directives/click-outside/index.js');
  17. var index = require('../../../hooks/use-locale/index.js');
  18. var index$1 = require('../../../hooks/use-namespace/index.js');
  19. var useFormItem = require('../../form/src/hooks/use-form-item.js');
  20. var useFormCommonProps = require('../../form/src/hooks/use-form-common-props.js');
  21. var index$2 = require('../../../hooks/use-empty-values/index.js');
  22. var index$3 = require('../../../hooks/use-focus-controller/index.js');
  23. var event = require('../../../constants/event.js');
  24. var error = require('../../../utils/error.js');
  25. var aria = require('../../../constants/aria.js');
  26. const __default__ = vue.defineComponent({
  27. name: "ElColorPicker"
  28. });
  29. const _sfc_main = /* @__PURE__ */ vue.defineComponent({
  30. ...__default__,
  31. props: colorPicker.colorPickerProps,
  32. emits: colorPicker.colorPickerEmits,
  33. setup(__props, { expose, emit }) {
  34. const props = __props;
  35. const { t } = index.useLocale();
  36. const ns = index$1.useNamespace("color");
  37. const { formItem } = useFormItem.useFormItem();
  38. const colorSize = useFormCommonProps.useFormSize();
  39. const colorDisabled = useFormCommonProps.useFormDisabled();
  40. const { valueOnClear, isEmptyValue } = index$2.useEmptyValues(props, null);
  41. const commonColor = useCommonColor.useCommonColor(props, emit);
  42. const { inputId: buttonId, isLabeledByFormItem } = useFormItem.useFormItemInputId(props, {
  43. formItemContext: formItem
  44. });
  45. const popper = vue.ref();
  46. const triggerRef = vue.ref();
  47. const pickerPanelRef = vue.ref();
  48. const showPicker = vue.ref(false);
  49. const showPanelColor = vue.ref(false);
  50. let shouldActiveChange = true;
  51. const { isFocused, handleFocus, handleBlur } = index$3.useFocusController(triggerRef, {
  52. disabled: colorDisabled,
  53. beforeBlur(event) {
  54. var _a;
  55. return (_a = popper.value) == null ? void 0 : _a.isFocusInsideContent(event);
  56. },
  57. afterBlur() {
  58. setShowPicker(false);
  59. resetColor();
  60. }
  61. });
  62. const color$1 = core.reactiveComputed(() => {
  63. var _a, _b;
  64. return (_b = (_a = pickerPanelRef.value) == null ? void 0 : _a.color) != null ? _b : commonColor.color;
  65. });
  66. const panelProps = vue.computed(() => lodashUnified.pick(props, Object.keys(colorPickerPanel.colorPickerPanelProps)));
  67. const displayedColor = vue.computed(() => {
  68. if (!props.modelValue && !showPanelColor.value) {
  69. return "transparent";
  70. }
  71. return displayedRgb(color$1, props.showAlpha);
  72. });
  73. const currentColor = vue.computed(() => {
  74. return !props.modelValue && !showPanelColor.value ? "" : color$1.value;
  75. });
  76. const buttonAriaLabel = vue.computed(() => {
  77. return !isLabeledByFormItem.value ? props.ariaLabel || t("el.colorpicker.defaultLabel") : void 0;
  78. });
  79. const buttonAriaLabelledby = vue.computed(() => {
  80. return isLabeledByFormItem.value ? formItem == null ? void 0 : formItem.labelId : void 0;
  81. });
  82. const btnKls = vue.computed(() => {
  83. return [
  84. ns.b("picker"),
  85. ns.is("disabled", colorDisabled.value),
  86. ns.bm("picker", colorSize.value),
  87. ns.is("focused", isFocused.value)
  88. ];
  89. });
  90. function displayedRgb(color2, showAlpha) {
  91. const { r, g, b, a } = color2.toRgb();
  92. return showAlpha ? `rgba(${r}, ${g}, ${b}, ${a})` : `rgb(${r}, ${g}, ${b})`;
  93. }
  94. function setShowPicker(value) {
  95. showPicker.value = value;
  96. }
  97. const debounceSetShowPicker = lodashUnified.debounce(setShowPicker, 100, { leading: true });
  98. function show() {
  99. if (colorDisabled.value)
  100. return;
  101. setShowPicker(true);
  102. }
  103. function hide() {
  104. debounceSetShowPicker(false);
  105. resetColor();
  106. }
  107. function resetColor() {
  108. vue.nextTick(() => {
  109. if (props.modelValue) {
  110. color$1.fromString(props.modelValue);
  111. } else {
  112. color$1.value = "";
  113. vue.nextTick(() => {
  114. showPanelColor.value = false;
  115. });
  116. }
  117. });
  118. }
  119. function handleTrigger() {
  120. if (colorDisabled.value)
  121. return;
  122. if (showPicker.value) {
  123. resetColor();
  124. }
  125. debounceSetShowPicker(!showPicker.value);
  126. }
  127. function confirmValue() {
  128. const value = isEmptyValue(color$1.value) ? valueOnClear.value : color$1.value;
  129. emit(event.UPDATE_MODEL_EVENT, value);
  130. emit(event.CHANGE_EVENT, value);
  131. if (props.validateEvent) {
  132. formItem == null ? void 0 : formItem.validate("change").catch((err) => error.debugWarn());
  133. }
  134. debounceSetShowPicker(false);
  135. vue.nextTick(() => {
  136. const newColor = new color["default"]({
  137. enableAlpha: props.showAlpha,
  138. format: props.colorFormat || "",
  139. value: props.modelValue
  140. });
  141. if (!color$1.compare(newColor)) {
  142. resetColor();
  143. }
  144. });
  145. }
  146. function clear() {
  147. debounceSetShowPicker(false);
  148. emit(event.UPDATE_MODEL_EVENT, valueOnClear.value);
  149. emit(event.CHANGE_EVENT, valueOnClear.value);
  150. if (props.modelValue !== valueOnClear.value && props.validateEvent) {
  151. formItem == null ? void 0 : formItem.validate("change").catch((err) => error.debugWarn());
  152. }
  153. resetColor();
  154. }
  155. function handleClickOutside() {
  156. if (!showPicker.value)
  157. return;
  158. hide();
  159. isFocused.value && focus();
  160. }
  161. function handleEsc(event) {
  162. event.preventDefault();
  163. event.stopPropagation();
  164. setShowPicker(false);
  165. resetColor();
  166. }
  167. function handleKeyDown(event) {
  168. var _a, _b;
  169. switch (event.code) {
  170. case aria.EVENT_CODE.enter:
  171. case aria.EVENT_CODE.numpadEnter:
  172. case aria.EVENT_CODE.space:
  173. event.preventDefault();
  174. event.stopPropagation();
  175. show();
  176. (_b = (_a = pickerPanelRef == null ? void 0 : pickerPanelRef.value) == null ? void 0 : _a.inputRef) == null ? void 0 : _b.focus();
  177. break;
  178. case aria.EVENT_CODE.esc:
  179. handleEsc(event);
  180. break;
  181. }
  182. }
  183. function focus() {
  184. triggerRef.value.focus();
  185. }
  186. function blur() {
  187. triggerRef.value.blur();
  188. }
  189. vue.watch(() => currentColor.value, (val) => {
  190. shouldActiveChange && emit("activeChange", val);
  191. shouldActiveChange = true;
  192. });
  193. vue.watch(() => color$1.value, () => {
  194. if (!props.modelValue && !showPanelColor.value) {
  195. showPanelColor.value = true;
  196. }
  197. });
  198. vue.watch(() => props.modelValue, (newVal) => {
  199. if (!newVal) {
  200. showPanelColor.value = false;
  201. } else if (newVal && newVal !== color$1.value) {
  202. shouldActiveChange = false;
  203. color$1.fromString(newVal);
  204. }
  205. });
  206. vue.provide(colorPickerPanel.ROOT_COMMON_COLOR_INJECTION_KEY, commonColor);
  207. expose({
  208. color: color$1,
  209. show,
  210. hide,
  211. focus,
  212. blur
  213. });
  214. return (_ctx, _cache) => {
  215. return vue.openBlock(), vue.createBlock(vue.unref(index$4.ElTooltip), {
  216. ref_key: "popper",
  217. ref: popper,
  218. visible: showPicker.value,
  219. "show-arrow": false,
  220. "fallback-placements": ["bottom", "top", "right", "left"],
  221. offset: 0,
  222. "gpu-acceleration": false,
  223. "popper-class": [vue.unref(ns).be("picker", "panel"), _ctx.popperClass],
  224. "stop-popper-mouse-event": false,
  225. pure: "",
  226. effect: "light",
  227. trigger: "click",
  228. teleported: _ctx.teleported,
  229. transition: `${vue.unref(ns).namespace.value}-zoom-in-top`,
  230. persistent: _ctx.persistent,
  231. "append-to": _ctx.appendTo,
  232. onHide: ($event) => setShowPicker(false)
  233. }, {
  234. content: vue.withCtx(() => [
  235. vue.withDirectives((vue.openBlock(), vue.createBlock(vue.unref(index$5.ElColorPickerPanel), vue.mergeProps({
  236. ref_key: "pickerPanelRef",
  237. ref: pickerPanelRef
  238. }, vue.unref(panelProps), {
  239. border: false,
  240. onKeydown: vue.withKeys(handleEsc, ["esc"])
  241. }), {
  242. footer: vue.withCtx(() => [
  243. vue.createElementVNode("div", null, [
  244. vue.createVNode(vue.unref(index$6.ElButton), {
  245. class: vue.normalizeClass(vue.unref(ns).be("footer", "link-btn")),
  246. text: "",
  247. size: "small",
  248. onClick: clear
  249. }, {
  250. default: vue.withCtx(() => [
  251. vue.createTextVNode(vue.toDisplayString(vue.unref(t)("el.colorpicker.clear")), 1)
  252. ]),
  253. _: 1
  254. }, 8, ["class"]),
  255. vue.createVNode(vue.unref(index$6.ElButton), {
  256. plain: "",
  257. size: "small",
  258. class: vue.normalizeClass(vue.unref(ns).be("footer", "btn")),
  259. onClick: confirmValue
  260. }, {
  261. default: vue.withCtx(() => [
  262. vue.createTextVNode(vue.toDisplayString(vue.unref(t)("el.colorpicker.confirm")), 1)
  263. ]),
  264. _: 1
  265. }, 8, ["class"])
  266. ])
  267. ]),
  268. _: 1
  269. }, 16, ["onKeydown"])), [
  270. [vue.unref(index$7["default"]), handleClickOutside, triggerRef.value]
  271. ])
  272. ]),
  273. default: vue.withCtx(() => [
  274. vue.createElementVNode("div", vue.mergeProps({
  275. id: vue.unref(buttonId),
  276. ref_key: "triggerRef",
  277. ref: triggerRef
  278. }, _ctx.$attrs, {
  279. class: vue.unref(btnKls),
  280. role: "button",
  281. "aria-label": vue.unref(buttonAriaLabel),
  282. "aria-labelledby": vue.unref(buttonAriaLabelledby),
  283. "aria-description": vue.unref(t)("el.colorpicker.description", { color: _ctx.modelValue || "" }),
  284. "aria-disabled": vue.unref(colorDisabled),
  285. tabindex: vue.unref(colorDisabled) ? void 0 : _ctx.tabindex,
  286. onKeydown: handleKeyDown,
  287. onFocus: vue.unref(handleFocus),
  288. onBlur: vue.unref(handleBlur)
  289. }), [
  290. vue.createElementVNode("div", {
  291. class: vue.normalizeClass(vue.unref(ns).be("picker", "trigger")),
  292. onClick: handleTrigger
  293. }, [
  294. vue.createElementVNode("span", {
  295. class: vue.normalizeClass([vue.unref(ns).be("picker", "color"), vue.unref(ns).is("alpha", _ctx.showAlpha)])
  296. }, [
  297. vue.createElementVNode("span", {
  298. class: vue.normalizeClass(vue.unref(ns).be("picker", "color-inner")),
  299. style: vue.normalizeStyle({
  300. backgroundColor: vue.unref(displayedColor)
  301. })
  302. }, [
  303. vue.withDirectives(vue.createVNode(vue.unref(index$8.ElIcon), {
  304. class: vue.normalizeClass([vue.unref(ns).be("picker", "icon"), vue.unref(ns).is("icon-arrow-down")])
  305. }, {
  306. default: vue.withCtx(() => [
  307. vue.createVNode(vue.unref(iconsVue.ArrowDown))
  308. ]),
  309. _: 1
  310. }, 8, ["class"]), [
  311. [vue.vShow, _ctx.modelValue || showPanelColor.value]
  312. ]),
  313. vue.withDirectives(vue.createVNode(vue.unref(index$8.ElIcon), {
  314. class: vue.normalizeClass([vue.unref(ns).be("picker", "empty"), vue.unref(ns).is("icon-close")])
  315. }, {
  316. default: vue.withCtx(() => [
  317. vue.createVNode(vue.unref(iconsVue.Close))
  318. ]),
  319. _: 1
  320. }, 8, ["class"]), [
  321. [vue.vShow, !_ctx.modelValue && !showPanelColor.value]
  322. ])
  323. ], 6)
  324. ], 2)
  325. ], 2)
  326. ], 16, ["id", "aria-label", "aria-labelledby", "aria-description", "aria-disabled", "tabindex", "onFocus", "onBlur"])
  327. ]),
  328. _: 1
  329. }, 8, ["visible", "popper-class", "teleported", "transition", "persistent", "append-to", "onHide"]);
  330. };
  331. }
  332. });
  333. var ColorPicker = /* @__PURE__ */ pluginVue_exportHelper["default"](_sfc_main, [["__file", "color-picker.vue"]]);
  334. exports["default"] = ColorPicker;
  335. //# sourceMappingURL=color-picker2.js.map