Browse Source

color picker

qinyan 1 năm trước cách đây
mục cha
commit
5f8ff2d304

+ 2 - 0
package.json

@@ -27,6 +27,7 @@
     "@ckeditor/ckeditor5-paragraph": "^38.0.0",
     "@ckeditor/ckeditor5-theme-lark": "^38.0.0",
     "@ckeditor/ckeditor5-vue": "^5.1.0",
+    "@jaames/iro": "^5.5.2",
     "@linaria/core": "^4.1.1",
     "@queenjs-modules/auth": "^0.0.20",
     "@queenjs-modules/queditor": "0.0.13",
@@ -75,6 +76,7 @@
     "three": "^0.146.0",
     "vconsole": "^3.15.1",
     "vue": "^3.2.45",
+    "vue-color-kit": "^1.0.6",
     "vue-dndrop": "^1.3.1",
     "vue-router": "^4.0.3",
     "vue-types": "^4.2.1"

+ 3 - 0
src/assets/icons/components/IconPicker.tsx

@@ -0,0 +1,3 @@
+
+import { createIcon } from '@queenjs/icons';
+export const IconPicker = createIcon(<svg viewBox="0 0 36 36"><g transform="translate(-8901 -1508)"><rect fill="none" width="36" height="36" rx="4" transform="translate(8901 1508)"/><g transform="translate(14.236 -72.08)"><path fill="#fff" opacity="0.7" d="M8897.759,1607.859s4.09.868,5.912-.411-2.936,3.535-2.936,3.535l-3.76.659Z" transform="translate(0.91 -6.628)"/><path fill="none" stroke="#fff" stroke-linecap="round" d="M8884.98,1589.079l6.822,6.821" transform="translate(18.755 3.213)"/><path fill="none" stroke="#fff" stroke-linecap="round" stroke-linejoin="round" d="M8886.931,1586.8l-10.344,10.345-.994,4.211,4.074-.828,10.268-10.828Z" transform="translate(22 4)"/></g></g></svg>)

+ 1 - 0
src/assets/icons/index.ts

@@ -35,6 +35,7 @@ export * from "./components/IconLocked";
 export * from "./components/IconMove";
 export * from "./components/IconMusic";
 export * from "./components/IconPalette";
+export * from "./components/IconPicker";
 export * from "./components/IconPlay";
 export * from "./components/IconPlay2";
 export * from "./components/IconPreview";

+ 1 - 0
src/assets/icons/svg/picker.svg

@@ -0,0 +1 @@
+<svg viewBox="0 0 36 36"><g transform="translate(-8901 -1508)"><rect fill="none" width="36" height="36" rx="4" transform="translate(8901 1508)"/><g transform="translate(14.236 -72.08)"><path fill="#fff" opacity="0.7" d="M8897.759,1607.859s4.09.868,5.912-.411-2.936,3.535-2.936,3.535l-3.76.659Z" transform="translate(0.91 -6.628)"/><path fill="none" stroke="#fff" stroke-linecap="round" d="M8884.98,1589.079l6.822,6.821" transform="translate(18.755 3.213)"/><path fill="none" stroke="#fff" stroke-linecap="round" stroke-linejoin="round" d="M8886.931,1586.8l-10.344,10.345-.994,4.211,4.074-.828,10.268-10.828Z" transform="translate(22 4)"/></g></g></svg>

+ 6 - 4
src/modules/editor/components/CompUI/formItems/NewColorPicker/Panel.tsx

@@ -1,9 +1,9 @@
+import { css } from "@linaria/core";
 import { Divider, Tabs } from "ant-design-vue";
 import { computed, defineComponent, reactive, watch } from "vue";
-import Picker from "./Picker";
-import ColorList, { formatColor, gradientColorType } from "./ColorList";
-import { css } from "@linaria/core";
 import { any } from "vue-types";
+import ColorList, { gradientColorType } from "./ColorList";
+import Picker from "./Picker";
 
 export default defineComponent({
   props: {
@@ -16,6 +16,8 @@ export default defineComponent({
     });
 
     return () => {
+      const color =
+        typeof props.value == "string" ? props.value : props.value.colors[0];
       return (
         <div class="w-280px px-5px pb-10px ">
           <Tabs
@@ -25,7 +27,7 @@ export default defineComponent({
             onChange={(v: any) => (state.key = v)}
           >
             <Tabs.TabPane tab="纯色" key={"0"}>
-              <Picker value="#f9c" />
+              <Picker value={color} onChange={(data) => emit("change", data)} />
             </Tabs.TabPane>
             <Tabs.TabPane tab="渐变" key={"1"}>
               <MutiColor

+ 72 - 51
src/modules/editor/components/CompUI/formItems/NewColorPicker/Picker.tsx

@@ -1,6 +1,8 @@
-import { defineComponent, onMounted, onUnmounted } from "vue";
-import "@simonwep/pickr/dist/themes/nano.min.css"; // 'nano' theme
-import Pickr from "@simonwep/pickr";
+import { IconPicker } from "@/assets/icons";
+import iro from "@jaames/iro";
+import { css } from "@linaria/core";
+import { Input } from "ant-design-vue";
+import { defineComponent, onMounted } from "vue";
 import { string } from "vue-types";
 
 export default defineComponent({
@@ -11,65 +13,84 @@ export default defineComponent({
   setup(props, { emit }) {
     let pickr: any = null;
 
-    onMounted(() => {
-      // initPicker();
-    });
-
-    onUnmounted(() => {
-      // pickr.destroyAndRemove();
-    });
-
     function initPicker() {
-      pickr = Pickr.create({
-        el: ".color-picker",
-        container: ".color-container",
-        theme: "nano",
-        default: props.value,
-        i18n: {
-          "btn:save": "确定",
-        },
-        components: {
-          preview: true,
-          opacity: false,
-          hue: true,
-          interaction: {
-            hex: false,
-            rgba: false,
-            input: true,
-            save: true,
+      // @ts-ignore
+      pickr = new iro.ColorPicker("#boxPicker", {
+        width: 270,
+        boxHeight: 150,
+        color: props.value,
+        sliderSize: 16,
+        layout: [
+          {
+            component: iro.ui.Box,
           },
-        },
-      });
-
-      pickr.on("init", () => {
-        // console.log('Event: "init"', instance);
-        pickr.show();
-      });
-
-      pickr.on("change", (color: any) => {
-        // const hexa = color.toHEXA().toString();
-        // state.colorList[state.index] = hexa;
-        // emit("change", hexa);
+          {
+            component: iro.ui.Slider,
+            options: {
+              sliderType: "hue",
+              id: "hue-slider",
+              handleSvg: "#handle",
+              handleProps: { x: -3, y: -3 },
+              handleRadius: 5,
+            },
+          },
+          {
+            component: iro.ui.Slider,
+            options: {
+              sliderType: "alpha",
+              handleSvg: "#handle",
+              handleProps: { x: -3, y: -3 },
+              handleRadius: 5,
+            },
+          },
+        ],
       });
 
-      pickr.on("save", (color: any) => {
-        // pickr.hide();
-        // const hexa = color.toHEXA().toString();
-        // state.colorList[state.index] = hexa;
-        // emit("change", hexa);
+      pickr.on("color:change", function (color: any) {
+        console.log(color.hex8String);
+        emit("change", color.hex8String);
       });
     }
 
-    const show = () => {
-      pickr.show();
-    };
+    onMounted(() => {
+      initPicker();
+    });
+
     return () => {
       return (
-        <div class="h-250px">
-          <div class="color-picker"></div>
-          <div class="color-container"></div>
+        <div class={styles}>
+          <svg style="display:none;">
+            <circle
+              fill="#fff"
+              id="handle"
+              cx="8"
+              cy="8"
+              r="6"
+              // stroke-width="1"
+              // stroke="#fff"
+            ></circle>
+          </svg>
+          <div class="ColorPicker" id="boxPicker"></div>
+          <div class="mt-15px flex items-center justify-between">
+            <Input
+              readonly
+              value="#fff"
+              class="mr-10px bg-dark-300 h-36px"
+              bordered={false}
+            />
+            <IconPicker class="text-36px bg-dark-300 rounded-2px" />
+          </div>
         </div>
       );
     };
   },
 });
+
+const styles = css`
+  .IroBox {
+    border-radius: 6px !important;
+  }
+  /* .IroHandle {
+    box-shadow: 0 0 3px #f00;
+  } */
+`;

+ 23 - 0
yarn.lock

@@ -1551,6 +1551,19 @@
   resolved "http://124.70.149.18:4873/@humanwhocodes%2fobject-schema/-/object-schema-1.2.1.tgz"
   integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
 
+"@irojs/iro-core@^1.2.1":
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/@irojs/iro-core/-/iro-core-1.2.1.tgz#ab45cf0899717fae785ef9661b82bb6f78cd3748"
+  integrity sha512-p2OvsBSSmidsDsTSkID6jEyXDF7lcyxPrkh3qBzasBZFpjkYd6kZ3yMWai3MlAaQ3F7li/Et7rSJVV09Fpei+A==
+
+"@jaames/iro@^5.5.2":
+  version "5.5.2"
+  resolved "https://registry.yarnpkg.com/@jaames/iro/-/iro-5.5.2.tgz#15301c19080b985aede06c5f07867aa20d06e679"
+  integrity sha512-Fbi5U4Vdkw6UsF+R3oMlPONqkvUDMkwzh+mX718gQsDFt3+1r1jvGsrfCbedmXAAy0WsjDHOrefK0BkDk99TQg==
+  dependencies:
+    "@irojs/iro-core" "^1.2.1"
+    preact "^10.0.0"
+
 "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2":
   version "0.3.3"
   resolved "http://124.70.149.18:4873/@jridgewell%2fgen-mapping/-/gen-mapping-0.3.3.tgz"
@@ -7198,6 +7211,11 @@ postcss@^8.1.10, postcss@^8.2.15, postcss@^8.2.6, postcss@^8.3.5, postcss@^8.4.1
     picocolors "^1.0.0"
     source-map-js "^1.0.2"
 
+preact@^10.0.0:
+  version "10.16.0"
+  resolved "https://registry.yarnpkg.com/preact/-/preact-10.16.0.tgz#68a06d70b191b8a313ea722d61e09c6b2a79a37e"
+  integrity sha512-XTSj3dJ4roKIC93pald6rWuB2qQJO9gO2iLLyTe87MrjQN+HklueLsmskbywEWqCHlclgz3/M4YLL2iBr9UmMA==
+
 prelude-ls@^1.2.1:
   version "1.2.1"
   resolved "http://124.70.149.18:4873/prelude-ls/-/prelude-ls-1.2.1.tgz"
@@ -8664,6 +8682,11 @@ vue-cli-plugin-windicss@~1.1.6:
     defu "^6.0.0"
     windicss-webpack-plugin "^1.7.4"
 
+vue-color-kit@^1.0.6:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/vue-color-kit/-/vue-color-kit-1.0.6.tgz#1f8b4780e7b1d3a079f852f47128c1e6b5eb05fc"
+  integrity sha512-56oSUp8hGIZ3E4ayZLqTDAb2C7VzaWAC1EVUsZEvPCD2wiiiFd2L2BiEGN1ingfz538sYWKNXxMZQGslqbMiBg==
+
 vue-demi@*, vue-demi@>=0.14.0:
   version "0.14.5"
   resolved "http://124.70.149.18:4873/vue-demi/-/vue-demi-0.14.5.tgz"