UNPKG

winbox-ui-next

Version:

We Design Vue 2.0: A Vue.js 3 UI Library

615 lines (614 loc) 20.3 kB
"use strict"; var __defProp = Object.defineProperty; var __defProps = Object.defineProperties; var __getOwnPropDescs = Object.getOwnPropertyDescriptors; var __getOwnPropSymbols = Object.getOwnPropertySymbols; var __hasOwnProp = Object.prototype.hasOwnProperty; var __propIsEnum = Object.prototype.propertyIsEnumerable; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp.call(b, prop)) __defNormalProp(a, prop, b[prop]); if (__getOwnPropSymbols) for (var prop of __getOwnPropSymbols(b)) { if (__propIsEnum.call(b, prop)) __defNormalProp(a, prop, b[prop]); } return a; }; var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); Object.defineProperty(exports, "__esModule", { value: true }); exports[Symbol.toStringTag] = "Module"; var vue = require("vue"); var vdirs = require("vdirs"); var seemly = require("seemly"); var vooks = require("vooks"); var vueuc = require("vueuc"); require("../_styles/common/dark.js"); require("../_styles/common/light.js"); var light = require("../styles/light.js"); var useFormItem = require("../_mixins/use-form-item.js"); var useTheme = require("../_mixins/use-theme.js"); var useConfig = require("../_mixins/use-config.js"); require("@css-render/vue3-ssr"); var call = require("../_utils/vue/call.js"); require("../_utils/vue/wrapper.js"); require("../_utils/cssr/index.js"); var useAdjustedTo = require("../_utils/composable/use-adjusted-to.js"); require("../_utils/composable/use-lock-html-scroll.js"); require("../_utils/composable/use-is-composing.js"); require("../_styles/global/index.cssr.js"); var useCssVarsClass = require("../_mixins/use-css-vars-class.js"); require("css-render"); var HueSlider = require("./HueSlider.js"); var AlphaSlider = require("./AlphaSlider.js"); var Pallete = require("./Pallete.js"); var ColorInput = require("./ColorInput.js"); var ColorPickerTrigger = require("./ColorPickerTrigger.js"); var utils = require("./utils.js"); var ColorPickerSwatches = require("./ColorPickerSwatches.js"); var ColorPreview = require("./ColorPreview.js"); var context = require("./context.js"); var index_cssr = require("./styles/index.cssr.js"); var index = require("../../locale/index.js"); var createKey = require("../_utils/cssr/create-key.js"); const colorPickerProps = __spreadProps(__spreadValues({}, useTheme["default"].props), { "value": String, "show": { type: Boolean, default: void 0 }, "defaultShow": Boolean, "defaultValue": String, "modes": { type: Array, default: () => ["rgb", "hex", "hsl"] }, "placement": { type: String, default: "bottom-start" }, "to": useAdjustedTo.useAdjustedTo.propTo, "showAlpha": { type: Boolean, default: true }, "showPreview": Boolean, "swatches": Array, "disabled": { type: Boolean, default: void 0 }, "actions": { type: Array, default: null }, "internalActions": Array, "size": String, "renderLabel": Function, "onComplete": Function, "onConfirm": Function, "onUpdate:show": [Function, Array], "onUpdateShow": [Function, Array], "onUpdate:value": [Function, Array], "onUpdateValue": [Function, Array] }); var _ColorPicker = vue.defineComponent({ name: "ColorPicker", props: colorPickerProps, setup(props, { slots }) { const { t } = index.useI18n(); const selfRef = vue.ref(null); let upcomingValue = null; const formItem = useFormItem["default"](props); const { mergedSizeRef, mergedDisabledRef } = formItem; const { mergedClsPrefixRef, namespaceRef, inlineThemeDisabled } = useConfig["default"](props); const themeRef = useTheme["default"]("ColorPicker", "-color-picker", index_cssr, light["default"], props, mergedClsPrefixRef); vue.provide(context.colorPickerInjectionKey, { themeRef, renderLabelRef: vue.toRef(props, "renderLabel"), colorPickerSlots: slots }); const uncontrolledShowRef = vue.ref(props.defaultShow); const mergedShowRef = vooks.useMergedState(vue.toRef(props, "show"), uncontrolledShowRef); function doUpdateShow(value) { const { onUpdateShow, "onUpdate:show": _onUpdateShow } = props; if (onUpdateShow) call.call(onUpdateShow, value); if (_onUpdateShow) call.call(_onUpdateShow, value); uncontrolledShowRef.value = value; } const { defaultValue } = props; const uncontrolledValueRef = vue.ref(defaultValue === void 0 ? utils.deriveDefaultValue(props.modes, props.showAlpha) : defaultValue); const mergedValueRef = vooks.useMergedState(vue.toRef(props, "value"), uncontrolledValueRef); const undoStackRef = vue.ref([mergedValueRef.value]); const valueIndexRef = vue.ref(0); const valueModeRef = vue.computed(() => utils.getModeFromValue(mergedValueRef.value)); const { modes } = props; const displayedModeRef = vue.ref(utils.getModeFromValue(mergedValueRef.value) || modes[0] || "rgb"); function handleUpdateDisplayedMode() { const { modes: modes2 } = props; const { value: displayedMode } = displayedModeRef; const currentModeIndex = modes2.findIndex((mode) => mode === displayedMode); if (~currentModeIndex) { displayedModeRef.value = modes2[(currentModeIndex + 1) % modes2.length]; } else { displayedModeRef.value = "rgb"; } } let _h; let s; let l; let v; let r; let g; let b; let a; const hsvaRef = vue.computed(() => { const { value: mergedValue } = mergedValueRef; if (!mergedValue) return null; switch (valueModeRef.value) { case "hsv": return seemly.hsva(mergedValue); case "hsl": [_h, s, l, a] = seemly.hsla(mergedValue); return [...seemly.hsl2hsv(_h, s, l), a]; case "rgb": case "hex": [r, g, b, a] = seemly.rgba(mergedValue); return [...seemly.rgb2hsv(r, g, b), a]; } }); const rgbaRef = vue.computed(() => { const { value: mergedValue } = mergedValueRef; if (!mergedValue) return null; switch (valueModeRef.value) { case "rgb": case "hex": return seemly.rgba(mergedValue); case "hsv": [_h, s, v, a] = seemly.hsva(mergedValue); return [...seemly.hsv2rgb(_h, s, v), a]; case "hsl": [_h, s, l, a] = seemly.hsla(mergedValue); return [...seemly.hsl2rgb(_h, s, l), a]; } }); const hslaRef = vue.computed(() => { const { value: mergedValue } = mergedValueRef; if (!mergedValue) return null; switch (valueModeRef.value) { case "hsl": return seemly.hsla(mergedValue); case "hsv": [_h, s, v, a] = seemly.hsva(mergedValue); return [...seemly.hsv2hsl(_h, s, v), a]; case "rgb": case "hex": [r, g, b, a] = seemly.rgba(mergedValue); return [...seemly.rgb2hsl(r, g, b), a]; } }); const mergedValueArrRef = vue.computed(() => { switch (displayedModeRef.value) { case "rgb": case "hex": return rgbaRef.value; case "hsv": return hsvaRef.value; case "hsl": return hslaRef.value; } }); const displayedHueRef = vue.ref(0); const displayedAlphaRef = vue.ref(1); const displayedSvRef = vue.ref([0, 0]); function handleUpdateSv(s2, v2) { const { value: hsvaArr } = hsvaRef; const hue = displayedHueRef.value; const alpha = hsvaArr ? hsvaArr[3] : 1; displayedSvRef.value = [s2, v2]; const { showAlpha } = props; switch (displayedModeRef.value) { case "hsv": doUpdateValue((showAlpha ? seemly.toHsvaString : seemly.toHsvString)([hue, s2, v2, alpha]), "cursor"); break; case "hsl": doUpdateValue((showAlpha ? seemly.toHslaString : seemly.toHslString)([...seemly.hsv2hsl(hue, s2, v2), alpha]), "cursor"); break; case "rgb": doUpdateValue((showAlpha ? seemly.toRgbaString : seemly.toRgbString)([...seemly.hsv2rgb(hue, s2, v2), alpha]), "cursor"); break; case "hex": doUpdateValue((showAlpha ? seemly.toHexaString : seemly.toHexString)([...seemly.hsv2rgb(hue, s2, v2), alpha]), "cursor"); break; } } function handleUpdateHue(hue) { displayedHueRef.value = hue; const { value: hsvaArr } = hsvaRef; if (!hsvaArr) { return; } const [, s2, v2, a2] = hsvaArr; const { showAlpha } = props; switch (displayedModeRef.value) { case "hsv": doUpdateValue((showAlpha ? seemly.toHsvaString : seemly.toHsvString)([hue, s2, v2, a2]), "cursor"); break; case "rgb": doUpdateValue((showAlpha ? seemly.toRgbaString : seemly.toRgbString)([...seemly.hsv2rgb(hue, s2, v2), a2]), "cursor"); break; case "hex": doUpdateValue((showAlpha ? seemly.toHexaString : seemly.toHexString)([...seemly.hsv2rgb(hue, s2, v2), a2]), "cursor"); break; case "hsl": doUpdateValue((showAlpha ? seemly.toHslaString : seemly.toHslString)([...seemly.hsv2hsl(hue, s2, v2), a2]), "cursor"); break; } } function handleUpdateAlpha(alpha) { switch (displayedModeRef.value) { case "hsv": [_h, s, v] = hsvaRef.value; doUpdateValue(seemly.toHsvaString([_h, s, v, alpha]), "cursor"); break; case "rgb": [r, g, b] = rgbaRef.value; doUpdateValue(seemly.toRgbaString([r, g, b, alpha]), "cursor"); break; case "hex": [r, g, b] = rgbaRef.value; doUpdateValue(seemly.toHexaString([r, g, b, alpha]), "cursor"); break; case "hsl": [_h, s, l] = hslaRef.value; doUpdateValue(seemly.toHslaString([_h, s, l, alpha]), "cursor"); break; } displayedAlphaRef.value = alpha; } function doUpdateValue(value, updateSource) { if (updateSource === "cursor") { upcomingValue = value; } else { upcomingValue = null; } const { nTriggerFormChange, nTriggerFormInput } = formItem; const { onUpdateValue, "onUpdate:value": _onUpdateValue } = props; if (onUpdateValue) call.call(onUpdateValue, value); if (_onUpdateValue) call.call(_onUpdateValue, value); nTriggerFormChange(); nTriggerFormInput(); uncontrolledValueRef.value = value; } function handleInputUpdateValue(value) { doUpdateValue(value, "input"); void vue.nextTick(handleComplete); } function handleComplete(pushStack = true) { const { value } = mergedValueRef; if (value) { const { nTriggerFormChange, nTriggerFormInput } = formItem; const { onComplete } = props; if (onComplete) { onComplete(value); } const { value: undoStack } = undoStackRef; const { value: valueIndex } = valueIndexRef; if (pushStack) { undoStack.splice(valueIndex + 1, undoStack.length, value); valueIndexRef.value = valueIndex + 1; } nTriggerFormChange(); nTriggerFormInput(); } } function undo() { const { value: valueIndex } = valueIndexRef; if (valueIndex - 1 < 0) return; doUpdateValue(undoStackRef.value[valueIndex - 1], "input"); handleComplete(false); valueIndexRef.value = valueIndex - 1; } function redo() { const { value: valueIndex } = valueIndexRef; if (valueIndex < 0 || valueIndex + 1 >= undoStackRef.value.length) return; doUpdateValue(undoStackRef.value[valueIndex + 1], "input"); handleComplete(false); valueIndexRef.value = valueIndex + 1; } function handleClear() { doUpdateValue(null, "input"); doUpdateShow(false); } function handleConfirm() { const { value } = mergedValueRef; const { onConfirm } = props; if (onConfirm) { onConfirm(value); } doUpdateShow(false); } const undoableRef = vue.computed(() => valueIndexRef.value >= 1); const redoableRef = vue.computed(() => { const { value: undoStack } = undoStackRef; return undoStack.length > 1 && valueIndexRef.value < undoStack.length - 1; }); vue.watch(mergedShowRef, (value) => { if (!value) { undoStackRef.value = [mergedValueRef.value]; valueIndexRef.value = 0; } }); vue.watchEffect(() => { if (upcomingValue && upcomingValue === mergedValueRef.value) ; else { const { value } = hsvaRef; if (value) { displayedHueRef.value = value[0]; displayedAlphaRef.value = value[3]; displayedSvRef.value = [value[1], value[2]]; } } upcomingValue = null; }); const cssVarsRef = vue.computed(() => { const { value: mergedSize } = mergedSizeRef; const { common: { cubicBezierEaseInOut }, self: { [createKey.createKey("height", mergedSize)]: height } } = themeRef.value; return { "--n-height": height }; }); const themeClassHandle = inlineThemeDisabled ? useCssVarsClass.useThemeClass("color-picker", vue.computed(() => { return mergedSizeRef.value[0]; }), cssVarsRef, props) : void 0; function renderPanel() { var _a; const { value: rgba } = rgbaRef; const { value: displayedHue } = displayedHueRef; const { internalActions, modes: modes2, actions } = props; const { value: mergedClsPrefix } = mergedClsPrefixRef; return vue.createVNode("div", { "class": [`${mergedClsPrefix}-color-picker-panel`, themeClassHandle == null ? void 0 : themeClassHandle.themeClass.value], "onDragstart": (e) => { e.preventDefault(); }, "style": inlineThemeDisabled ? void 0 : cssVarsRef.value }, [vue.createVNode("div", { "class": `${mergedClsPrefix}-color-picker-control` }, [vue.createVNode(Pallete, { "clsPrefix": mergedClsPrefix, "rgba": rgba, "displayedHue": displayedHue, "displayedSv": displayedSvRef.value, "onUpdateSV": handleUpdateSv, "onComplete": handleComplete }, null), vue.createVNode("div", { "class": `${mergedClsPrefix}-color-picker-preview` }, [vue.createVNode("div", { "class": `${mergedClsPrefix}-color-picker-preview__sliders` }, [vue.createVNode(HueSlider, { "clsPrefix": mergedClsPrefix, "hue": displayedHue, "onUpdateHue": handleUpdateHue, "onComplete": handleComplete }, null), props.showAlpha ? vue.createVNode(AlphaSlider, { "clsPrefix": mergedClsPrefix, "rgba": rgba, "alpha": displayedAlphaRef.value, "onUpdateAlpha": handleUpdateAlpha, "onComplete": handleComplete }, null) : null]), props.showPreview ? vue.createVNode(ColorPreview, { "clsPrefix": mergedClsPrefix, "mode": displayedModeRef.value, "color": rgbaRef.value && seemly.toHexString(rgbaRef.value), "onUpdateColor": (color) => doUpdateValue(color, "input") }, null) : null]), vue.createVNode(ColorInput, { "clsPrefix": mergedClsPrefix, "showAlpha": props.showAlpha, "mode": displayedModeRef.value, "modes": modes2, "onUpdateMode": handleUpdateDisplayedMode, "value": mergedValueRef.value, "valueArr": mergedValueArrRef.value, "onUpdateValue": handleInputUpdateValue }, null), ((_a = props.swatches) == null ? void 0 : _a.length) && vue.createVNode(ColorPickerSwatches, { "clsPrefix": mergedClsPrefix, "mode": displayedModeRef.value, "swatches": props.swatches, "onUpdateColor": (color) => doUpdateValue(color, "input") }, null)]), (actions == null ? void 0 : actions.length) ? vue.createVNode("div", { "class": `${mergedClsPrefix}-color-picker-action` }, [actions.includes("confirm") && vue.createVNode(vue.resolveComponent("w-button"), { "size": "medium", "onClick": handleConfirm }, { default: () => t("colorPicker.confirm") }), actions.includes("clear") && vue.createVNode(vue.resolveComponent("w-button"), { "size": "medium", "onClick": handleClear, "disabled": !mergedValueRef.value }, { default: () => t("colorPicker.clear") })]) : null, slots.action ? vue.createVNode("div", { "class": `${mergedClsPrefix}-color-picker-action` }, { default: slots.action }) : internalActions ? vue.createVNode("div", { "class": `${mergedClsPrefix}-color-picker-action` }, [internalActions.includes("undo") && vue.createVNode(vue.resolveComponent("w-button"), { "size": "medium", "onClick": undo, "disabled": !undoableRef.value }, { default: () => t("colorPicker.undo") }), internalActions.includes("redo") && vue.createVNode(vue.resolveComponent("w-button"), { "size": "medium", "onClick": redo, "disabled": !redoableRef.value }, { default: () => t("colorPicker.redo") })]) : null]); } return { mergedSize: mergedSizeRef, mergedClsPrefix: mergedClsPrefixRef, namespace: namespaceRef, selfRef, hsla: hslaRef, rgba: rgbaRef, mergedShow: mergedShowRef, mergedDisabled: mergedDisabledRef, isMounted: vooks.useIsMounted(), adjustedTo: useAdjustedTo.useAdjustedTo(props), mergedValue: mergedValueRef, handleTriggerClick() { doUpdateShow(true); }, handleClickOutside(e) { var _a; if ((_a = selfRef.value) == null ? void 0 : _a.contains(seemly.getPreciseEventTarget(e))) { return; } doUpdateShow(false); }, renderPanel, cssVars: inlineThemeDisabled ? void 0 : cssVarsRef, themeClass: themeClassHandle == null ? void 0 : themeClassHandle.themeClass, onRender: themeClassHandle == null ? void 0 : themeClassHandle.onRender }; }, render() { const { $slots, mergedClsPrefix, onRender, mergedSize } = this; onRender == null ? void 0 : onRender(); return vue.createVNode("div", { "class": [this.themeClass, `${mergedClsPrefix}-color-picker ${mergedClsPrefix}-color-picker-${mergedSize}`], "ref": "selfRef", "style": this.cssVars }, [vue.createVNode(vueuc.VBinder, null, { default: () => [vue.createVNode(vueuc.VTarget, null, { default: () => vue.createVNode(ColorPickerTrigger, { "clsPrefix": mergedClsPrefix, "value": this.mergedValue, "hsla": this.hsla, "disabled": this.mergedDisabled, "onClick": this.handleTriggerClick }, { label: $slots.label }) }), vue.createVNode(vueuc.VFollower, { "placement": this.placement, "show": this.mergedShow, "containerClass": this.namespace, "teleportDisabled": this.adjustedTo === useAdjustedTo.useAdjustedTo.tdkey, "to": this.adjustedTo }, { default: () => this.mergedShow ? vue.withDirectives(this.renderPanel(), [[vdirs.clickoutside, this.handleClickOutside, void 0, { capture: true }]]) : null })] })]); } }); exports.colorPickerProps = colorPickerProps; exports["default"] = _ColorPicker;