张延森 3 lat temu
rodzic
commit
ad97302f55
8 zmienionych plików z 460 dodań i 91 usunięć
  1. 11
    0
      .eslintrc.js
  2. 3
    1
      package.json
  3. 27
    16
      src/App.vue
  4. 235
    0
      src/components/FireWork.vue
  5. 78
    0
      src/components/FireWorkList.vue
  6. 0
    58
      src/components/HelloWorld.vue
  7. 15
    10
      src/game.js
  8. 91
    6
      yarn.lock

+ 11
- 0
.eslintrc.js Wyświetl plik

@@ -0,0 +1,11 @@
1
+module.exports = {
2
+  extends: [
3
+    // add more generic rulesets here, such as:
4
+    // 'eslint:recommended',
5
+    'plugin:vue/vue3-recommended',
6
+    // 'plugin:vue/recommended' // Use this if you are using Vue.js 2.x.
7
+  ],
8
+  env: {
9
+    'vue/setup-compiler-macros': true
10
+  }
11
+}

+ 3
- 1
package.json Wyświetl plik

@@ -19,7 +19,9 @@
19 19
     "@vue/cli-plugin-eslint": "~5.0.0",
20 20
     "@vue/cli-service": "~5.0.0",
21 21
     "eslint": "^7.32.0",
22
-    "eslint-plugin-vue": "^8.0.3"
22
+    "eslint-plugin-vue": "^8.0.3",
23
+    "less": "^4.1.2",
24
+    "less-loader": "^10.2.0"
23 25
   },
24 26
   "eslintConfig": {
25 27
     "root": true,

+ 27
- 16
src/App.vue Wyświetl plik

@@ -1,17 +1,30 @@
1 1
 <template>
2 2
   <div ref="el"></div>
3
+  <FireWorkListVue :center="center" :raduis="raduis" ref="firesRef" />
3 4
 </template>
4 5
 
5 6
 <script setup>
6 7
   import { onBeforeUnmount, onMounted, ref } from 'vue';
8
+  import Two from "two.js";
9
+  import FireWorkListVue from './components/FireWorkList.vue';
7 10
   import game from "./game";
8 11
 
9 12
   const el = ref()
10
-  // const twoRef = ref()
13
+  const destroyRef = ref()
14
+  const firesRef = ref()
11 15
 
12
-  onMounted(() => {
13
-    game({
16
+  const raduis = 150
17
+  const center = {
18
+        x: document.body.offsetWidth / 2,
19
+        y: document.body.offsetHeight / 2,
20
+      }
21
+
22
+
23
+  const gameInit = () => {
24
+    destroyRef.value = game({
14 25
       el: el.value,
26
+      center,
27
+      raduis,
15 28
       onError: () => {
16 29
         alert('oo ~')
17 30
       },
@@ -19,28 +32,26 @@
19 32
         alert('你真牛逼')
20 33
       },
21 34
       onBingo: () => {
22
-        alert('厉害了, 厉害了')
35
+        console.log('-----firesRef------->', firesRef.value)
36
+        firesRef.value.toggle()
23 37
       }
24 38
     })
39
+  }
40
+
41
+  onMounted(() => {
42
+    gameInit()
25 43
   })
26 44
 
27 45
   onBeforeUnmount(() => {
28
-    // if (twoRef.value) {
29
-    //   twoRef.value.unbind('update');
30
-    //   twoRef.value.pause();
31
-    //   el.value.removeChild(twoRef.value.renderer.domElement);
32
-    // }
46
+    if (destroyRef.value) {
47
+      destroyRef.value();
48
+    }
33 49
   })
34 50
 
35 51
 </script>
36 52
 
37 53
 <style>
38
-#app {
39
-  font-family: Avenir, Helvetica, Arial, sans-serif;
40
-  -webkit-font-smoothing: antialiased;
41
-  -moz-osx-font-smoothing: grayscale;
42
-  text-align: center;
43
-  color: #2c3e50;
44
-  margin-top: 60px;
54
+html, body, #app {
55
+  height: 100%;
45 56
 }
46 57
 </style>

+ 235
- 0
src/components/FireWork.vue Wyświetl plik

@@ -0,0 +1,235 @@
1
+<template>
2
+  <div
3
+    v-if="visible"
4
+    class="firework-grp"
5
+    :style="grpStyle"
6
+  >
7
+    <div
8
+      class="firework"
9
+      :style="fireworkStyle"
10
+    >
11
+      <div class="drops-grp">
12
+        <span
13
+          class="drop drop-1"
14
+          @animationend="handleAnimationEnd"
15
+        />
16
+        <span class="drop drop-2" />
17
+        <span class="drop drop-3" />
18
+        <span class="drop drop-4" />
19
+      </div>
20
+      <div class="drops-grp drops-grp2">
21
+        <span class="drop drop-1" />
22
+        <span class="drop drop-2" />
23
+        <span class="drop drop-3" />
24
+        <span class="drop drop-4" />
25
+      </div>
26
+    </div>
27
+  </div>
28
+</template>
29
+
30
+<script setup>
31
+import { computed } from 'vue'
32
+
33
+const emit = defineEmits(['end'])
34
+const props = defineProps({
35
+	color: {
36
+		type: String,
37
+		default: '#535396'
38
+	},
39
+  scale: {
40
+    type: Number,
41
+    default: 0.5
42
+  },	
43
+  top: {
44
+    type: String,
45
+    default: '0px'
46
+  },
47
+  left: {
48
+    type: String,
49
+    default: '0px'
50
+  },
51
+	visible: {
52
+		type: Boolean,
53
+		default: false
54
+	},
55
+})
56
+
57
+const grpStyle = computed(() => ({
58
+	color: props.color,
59
+	top: props.top,
60
+	left: props.left,
61
+}))
62
+
63
+const fireworkStyle = computed(() => ({
64
+    transform: `scale(${props.scale})`,
65
+  }))
66
+
67
+const handleAnimationEnd = () => {
68
+	emit('end')
69
+}
70
+
71
+</script>
72
+
73
+<style lang="less" scoped>
74
+.firework-grp {
75
+	display: block;
76
+	color: #535396;
77
+	background: transparent;
78
+	position: absolute;
79
+}
80
+.drops-grp2 {
81
+	display: block;
82
+	width: 8.5em;
83
+	height: 8.5em;
84
+	position: absolute;
85
+	transform: rotate(45deg);
86
+}
87
+
88
+.drop {
89
+	display: block;
90
+	width: 1em;
91
+	height: 2em;
92
+	overflow: hidden;
93
+	position: absolute;
94
+	opacity: 0;
95
+
96
+	animation-timing-function: ease-in-out;
97
+	animation-duration: 1s;
98
+	animation-iteration-count: 1;
99
+}
100
+.drop:before {
101
+	content: "";
102
+	display: block;
103
+	width: 1em;
104
+	height: 1em;
105
+	background: currentColor;
106
+	border-radius: 50%;
107
+}
108
+.drop:after {
109
+	content: "";
110
+	display: block;
111
+	position: relative;
112
+	top: -0.4em;
113
+	width: 0;
114
+	height: 0;	
115
+	border-top: 1.4em solid currentColor;
116
+	border-left: 0.5em solid transparent;
117
+	border-right: 0.5em solid transparent;
118
+}
119
+
120
+.drop-1 {
121
+	left:3.75em;
122
+	top: 0;
123
+	animation-name: drop1anim;
124
+}
125
+.drop-2 {
126
+	top: 3.25em;
127
+	right: 0;
128
+	animation-name: drop2anim;
129
+}
130
+.drop-3 {
131
+	left:3.75em;
132
+	bottom: 0;
133
+	animation-name: drop3anim;
134
+}
135
+.drop-4 {
136
+	top: 3.25em;
137
+	left: 0;
138
+	animation-name: drop4anim;
139
+}
140
+
141
+@keyframes drop1anim {
142
+	0% { 
143
+		top:3.25em;
144
+		opacity: 0;
145
+		transform: scale(0.3);
146
+	}
147
+	25% {
148
+		opacity: 0;		
149
+	}
150
+	50% { 
151
+		opacity: 1;
152
+		transform: scale(1);
153
+	}
154
+	100% { 
155
+		top: -0.75em;
156
+		opacity: 0;
157
+		transform: scale(0.3);
158
+	}
159
+}
160
+
161
+
162
+@keyframes drop2anim {
163
+	0% { 
164
+		right:3.75em;
165
+		opacity: 0;
166
+		transform: scale(0.3) rotate(90deg);
167
+	}
168
+	25% {
169
+		opacity: 0;		
170
+	}
171
+	50% { 
172
+		opacity: 1;
173
+		transform: scale(1) rotate(90deg);
174
+	}
175
+	100% { 
176
+		right: -0.25em;
177
+		opacity: 0;
178
+		transform: scale(0.3) rotate(90deg);
179
+	}
180
+}
181
+@keyframes drop3anim {
182
+	0% { 
183
+		bottom:3.25em;
184
+		opacity: 0;
185
+		transform: scale(0.3) rotate(180deg);
186
+	}
187
+	25% {
188
+		opacity: 0;		
189
+	}
190
+	50% { 
191
+		opacity: 1;
192
+		transform: scale(1) rotate(180deg);
193
+	}
194
+	100% { 
195
+		bottom: -0.75em;
196
+		opacity: 0;
197
+		transform: scale(0.3) rotate(180deg);
198
+	}
199
+}
200
+@keyframes drop4anim {
201
+	0% { 
202
+		left:3.75em;
203
+		opacity: 0;
204
+		transform: scale(0.3) rotate(-90deg);
205
+	}
206
+	25% {
207
+		opacity: 0;		
208
+	}
209
+	50% { 
210
+		opacity: 1;
211
+		transform: scale(1) rotate(-90deg);
212
+	}
213
+	100% { 
214
+		left: -0.25em;
215
+		opacity: 0;
216
+		transform: scale(0.3) rotate(-90deg);
217
+	}
218
+}
219
+
220
+.firework {
221
+	font-size: 10px;
222
+	display: block;
223
+	width: 8.5em;
224
+	height: 8.5em;
225
+	position: absolute;
226
+}
227
+
228
+.drops-grp {
229
+	display: block;
230
+	width: 8.5em;
231
+	height: 8.5em;
232
+	position: absolute;
233
+}
234
+
235
+</style>

+ 78
- 0
src/components/FireWorkList.vue Wyświetl plik

@@ -0,0 +1,78 @@
1
+<template>
2
+  <div>
3
+    <FireWork
4
+      v-for="it in fireNum"
5
+      :key="it"
6
+      :color="colorList[it % 10]"
7
+      :left="calcLeft(it)"
8
+      :top="calcTop(it)"
9
+      :scale="clacScale()"
10
+      :visible="!isFinished"
11
+      @end="handleEnd"
12
+    />
13
+  </div>
14
+</template>
15
+
16
+<script setup>
17
+import { ref } from 'vue'
18
+  import FireWork from './FireWork.vue'
19
+  const colorList = ['#f5222d', '#d4380d', '#d46b08', '#d48806', '#d4b106', '#7cb305', '#389e0d', '#08979c', '#096dd9', '#531dab']
20
+  const random = (n, m) => parseInt(Math.random()*(n-m+1)+m)
21
+  
22
+  const props = defineProps({
23
+    center: {
24
+      type: Object,
25
+      required: true,
26
+    },
27
+    raduis: {
28
+      type: Number,
29
+      required: true,
30
+    },
31
+  })
32
+
33
+  const fireNum = ref(12)
34
+  const isFinished = ref(true)
35
+
36
+  const calcLeft = (inx) => {
37
+    let start, end;
38
+    if (inx < fireNum.value / 2) {
39
+      start = props.center.x - props.raduis - 150  // 150 随便写的
40
+      end = props.center.x
41
+    } else {
42
+      start = props.center.x
43
+      end = props.center.x + props.raduis
44
+    }
45
+
46
+    return `${random(start, end)}px`
47
+  }
48
+
49
+  const calcTop = (inx) => {
50
+    let start, end;
51
+    start = props.center.y - props.raduis - 150  // 50 随便写的
52
+    end = props.center.y - props.raduis
53
+
54
+    return `${random(start, end)}px`
55
+  }
56
+
57
+  const clacScale = () => {
58
+    const r = Math.random();
59
+
60
+    if (r < 0.1) return 0.1
61
+    if (r > 0.5) return 0.5
62
+    return r
63
+  }
64
+
65
+  const handleEnd = () => {
66
+    if (isFinished.value) return
67
+    isFinished.value = true
68
+
69
+    const t = setTimeout(() => {
70
+      fireNum.value = random(10, 20)
71
+      clearTimeout(t)
72
+    }, 0)
73
+  }
74
+
75
+  defineExpose({
76
+    toggle: () => isFinished.value = false
77
+  })
78
+</script>

+ 0
- 58
src/components/HelloWorld.vue Wyświetl plik

@@ -1,58 +0,0 @@
1
-<template>
2
-  <div class="hello">
3
-    <h1>{{ msg }}</h1>
4
-    <p>
5
-      For a guide and recipes on how to configure / customize this project,<br>
6
-      check out the
7
-      <a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>.
8
-    </p>
9
-    <h3>Installed CLI Plugins</h3>
10
-    <ul>
11
-      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li>
12
-      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint" target="_blank" rel="noopener">eslint</a></li>
13
-    </ul>
14
-    <h3>Essential Links</h3>
15
-    <ul>
16
-      <li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li>
17
-      <li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li>
18
-      <li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li>
19
-      <li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li>
20
-      <li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li>
21
-    </ul>
22
-    <h3>Ecosystem</h3>
23
-    <ul>
24
-      <li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li>
25
-      <li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li>
26
-      <li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a></li>
27
-      <li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li>
28
-      <li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li>
29
-    </ul>
30
-  </div>
31
-</template>
32
-
33
-<script>
34
-export default {
35
-  name: 'HelloWorld',
36
-  props: {
37
-    msg: String
38
-  }
39
-}
40
-</script>
41
-
42
-<!-- Add "scoped" attribute to limit CSS to this component only -->
43
-<style scoped>
44
-h3 {
45
-  margin: 40px 0 0;
46
-}
47
-ul {
48
-  list-style-type: none;
49
-  padding: 0;
50
-}
51
-li {
52
-  display: inline-block;
53
-  margin: 0 10px;
54
-}
55
-a {
56
-  color: #42b983;
57
-}
58
-</style>

+ 15
- 10
src/game.js Wyświetl plik

@@ -1,9 +1,8 @@
1
-
2 1
 import Two from "two.js";
3 2
 
4 3
 const colorList = ['#f5222d', '#d4380d', '#d46b08', '#d48806', '#d4b106', '#7cb305', '#389e0d', '#08979c', '#096dd9', '#531dab']
5 4
 
6
-export default function game({ el, onError, onSuccess, onBingo }) {
5
+export default function game({ el, center, raduis, onError, onSuccess, onBingo }) {
7 6
 
8 7
   // 是否游戏结束
9 8
   let isFinished = false;
@@ -16,16 +15,10 @@ export default function game({ el, onError, onSuccess, onBingo }) {
16 15
   const perAngle = 2 * Math.PI / 20 // 分20等份
17 16
 
18 17
   // 大转盘半径
19
-  const raduis = 150;
20
-
21
-  // 初始化
22
-  const two = new Two({
23
-    fullscreen: true,
24
-    autostart: true
25
-  }).appendTo(el);
18
+  // const raduis = 150;
26 19
 
27 20
   // 转盘中心坐标
28
-  const center = { x: two.width / 2, y: two.height / 2 }
21
+  // const center;
29 22
 
30 23
   // 轿厢 - 子弹
31 24
   const bullets = []
@@ -48,6 +41,12 @@ export default function game({ el, onError, onSuccess, onBingo }) {
48 41
   // 目标轿厢与子弹轿厢的映射字典
49 42
   const mntMap = {}
50 43
 
44
+  // 初始化
45
+  const two = new Two({
46
+    fullscreen: true,
47
+    autostart: true
48
+  }).appendTo(el);
49
+
51 50
   // 绘制转盘
52 51
   const drawRoundAbout = () => {
53 52
     const { x, y } = center
@@ -210,4 +209,10 @@ export default function game({ el, onError, onSuccess, onBingo }) {
210 209
       }
211 210
     }
212 211
   })
212
+
213
+  return () => {
214
+    two.unbind('update');
215
+    two.pause();
216
+    el.removeChild(two.renderer.domElement);
217
+  }
213 218
 }

+ 91
- 6
yarn.lock Wyświetl plik

@@ -2390,6 +2390,13 @@ cookie@0.4.2:
2390 2390
   resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432"
2391 2391
   integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==
2392 2392
 
2393
+copy-anything@^2.0.1:
2394
+  version "2.0.6"
2395
+  resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-2.0.6.tgz#092454ea9584a7b7ad5573062b2a87f5900fc480"
2396
+  integrity sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==
2397
+  dependencies:
2398
+    is-what "^3.14.1"
2399
+
2393 2400
 copy-webpack-plugin@^9.0.1:
2394 2401
   version "9.1.0"
2395 2402
   resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz#2d2c460c4c4695ec0a58afb2801a1205256c4e6b"
@@ -2588,7 +2595,7 @@ debug@2.6.9:
2588 2595
   dependencies:
2589 2596
     ms "2.0.0"
2590 2597
 
2591
-debug@^3.1.1:
2598
+debug@^3.1.1, debug@^3.2.6:
2592 2599
   version "3.2.7"
2593 2600
   resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
2594 2601
   integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
@@ -2796,6 +2803,13 @@ entities@^2.0.0:
2796 2803
   resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55"
2797 2804
   integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==
2798 2805
 
2806
+errno@^0.1.1:
2807
+  version "0.1.8"
2808
+  resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f"
2809
+  integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==
2810
+  dependencies:
2811
+    prr "~1.0.1"
2812
+
2799 2813
 error-ex@^1.3.1:
2800 2814
   version "1.3.2"
2801 2815
   resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
@@ -3530,7 +3544,7 @@ human-signals@^2.1.0:
3530 3544
   resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
3531 3545
   integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
3532 3546
 
3533
-iconv-lite@0.4.24:
3547
+iconv-lite@0.4.24, iconv-lite@^0.4.4:
3534 3548
   version "0.4.24"
3535 3549
   resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
3536 3550
   integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
@@ -3557,6 +3571,11 @@ ignore@^5.2.0:
3557 3571
   resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
3558 3572
   integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
3559 3573
 
3574
+image-size@~0.5.0:
3575
+  version "0.5.5"
3576
+  resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c"
3577
+  integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=
3578
+
3560 3579
 import-fresh@^3.0.0, import-fresh@^3.2.1:
3561 3580
   version "3.3.0"
3562 3581
   resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
@@ -3695,6 +3714,11 @@ is-unicode-supported@^0.1.0:
3695 3714
   resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
3696 3715
   integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==
3697 3716
 
3717
+is-what@^3.14.1:
3718
+  version "3.14.1"
3719
+  resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1"
3720
+  integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==
3721
+
3698 3722
 is-wsl@^2.1.1, is-wsl@^2.2.0:
3699 3723
   version "2.2.0"
3700 3724
   resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
@@ -3821,7 +3845,7 @@ kind-of@^6.0.2:
3821 3845
   resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
3822 3846
   integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
3823 3847
 
3824
-klona@^2.0.5:
3848
+klona@^2.0.4, klona@^2.0.5:
3825 3849
   version "2.0.5"
3826 3850
   resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc"
3827 3851
   integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==
@@ -3841,6 +3865,30 @@ launch-editor@^2.2.1, launch-editor@^2.3.0:
3841 3865
     picocolors "^1.0.0"
3842 3866
     shell-quote "^1.6.1"
3843 3867
 
3868
+less-loader@^10.2.0:
3869
+  version "10.2.0"
3870
+  resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-10.2.0.tgz#97286d8797dc3dc05b1d16b0ecec5f968bdd4e32"
3871
+  integrity sha512-AV5KHWvCezW27GT90WATaDnfXBv99llDbtaj4bshq6DvAihMdNjaPDcUMa6EXKLRF+P2opFenJp89BXg91XLYg==
3872
+  dependencies:
3873
+    klona "^2.0.4"
3874
+
3875
+less@^4.1.2:
3876
+  version "4.1.2"
3877
+  resolved "https://registry.yarnpkg.com/less/-/less-4.1.2.tgz#6099ee584999750c2624b65f80145f8674e4b4b0"
3878
+  integrity sha512-EoQp/Et7OSOVu0aJknJOtlXZsnr8XE8KwuzTHOLeVSEx8pVWUICc8Q0VYRHgzyjX78nMEyC/oztWFbgyhtNfDA==
3879
+  dependencies:
3880
+    copy-anything "^2.0.1"
3881
+    parse-node-version "^1.0.1"
3882
+    tslib "^2.3.0"
3883
+  optionalDependencies:
3884
+    errno "^0.1.1"
3885
+    graceful-fs "^4.1.2"
3886
+    image-size "~0.5.0"
3887
+    make-dir "^2.1.0"
3888
+    mime "^1.4.1"
3889
+    needle "^2.5.2"
3890
+    source-map "~0.6.0"
3891
+
3844 3892
 levn@^0.4.1:
3845 3893
   version "0.4.1"
3846 3894
   resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
@@ -3980,6 +4028,14 @@ magic-string@^0.25.7:
3980 4028
   dependencies:
3981 4029
     sourcemap-codec "^1.4.8"
3982 4030
 
4031
+make-dir@^2.1.0:
4032
+  version "2.1.0"
4033
+  resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
4034
+  integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==
4035
+  dependencies:
4036
+    pify "^4.0.1"
4037
+    semver "^5.6.0"
4038
+
3983 4039
 make-dir@^3.0.2, make-dir@^3.1.0:
3984 4040
   version "3.1.0"
3985 4041
   resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
@@ -4051,7 +4107,7 @@ mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24,
4051 4107
   dependencies:
4052 4108
     mime-db "1.52.0"
4053 4109
 
4054
-mime@1.6.0:
4110
+mime@1.6.0, mime@^1.4.1:
4055 4111
   version "1.6.0"
4056 4112
   resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
4057 4113
   integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
@@ -4156,6 +4212,15 @@ natural-compare@^1.4.0:
4156 4212
   resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
4157 4213
   integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
4158 4214
 
4215
+needle@^2.5.2:
4216
+  version "2.9.1"
4217
+  resolved "https://registry.yarnpkg.com/needle/-/needle-2.9.1.tgz#22d1dffbe3490c2b83e301f7709b6736cd8f2684"
4218
+  integrity sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==
4219
+  dependencies:
4220
+    debug "^3.2.6"
4221
+    iconv-lite "^0.4.4"
4222
+    sax "^1.2.4"
4223
+
4159 4224
 negotiator@0.6.3:
4160 4225
   version "0.6.3"
4161 4226
   resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
@@ -4403,6 +4468,11 @@ parse-json@^5.0.0:
4403 4468
     json-parse-even-better-errors "^2.3.0"
4404 4469
     lines-and-columns "^1.1.6"
4405 4470
 
4471
+parse-node-version@^1.0.1:
4472
+  version "1.0.1"
4473
+  resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b"
4474
+  integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==
4475
+
4406 4476
 parse5-htmlparser2-tree-adapter@^6.0.0:
4407 4477
   version "6.0.1"
4408 4478
   resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6"
@@ -4483,6 +4553,11 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
4483 4553
   resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
4484 4554
   integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
4485 4555
 
4556
+pify@^4.0.1:
4557
+  version "4.0.1"
4558
+  resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
4559
+  integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
4560
+
4486 4561
 pkg-dir@^4.1.0:
4487 4562
   version "4.2.0"
4488 4563
   resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
@@ -4807,6 +4882,11 @@ proxy-addr@~2.0.7:
4807 4882
     forwarded "0.2.0"
4808 4883
     ipaddr.js "1.9.1"
4809 4884
 
4885
+prr@~1.0.1:
4886
+  version "1.0.1"
4887
+  resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
4888
+  integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
4889
+
4810 4890
 pseudomap@^1.0.2:
4811 4891
   version "1.0.2"
4812 4892
   resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
@@ -5058,6 +5138,11 @@ safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0:
5058 5138
   resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
5059 5139
   integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
5060 5140
 
5141
+sax@^1.2.4:
5142
+  version "1.2.4"
5143
+  resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
5144
+  integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
5145
+
5061 5146
 schema-utils@^2.6.5:
5062 5147
   version "2.7.1"
5063 5148
   resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7"
@@ -5098,7 +5183,7 @@ selfsigned@^2.0.1:
5098 5183
   dependencies:
5099 5184
     node-forge "^1"
5100 5185
 
5101
-"semver@2 || 3 || 4 || 5", semver@^5.5.0:
5186
+"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0:
5102 5187
   version "5.7.1"
5103 5188
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
5104 5189
   integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
@@ -5577,7 +5662,7 @@ tr46@~0.0.3:
5577 5662
   resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
5578 5663
   integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=
5579 5664
 
5580
-tslib@^2.0.3:
5665
+tslib@^2.0.3, tslib@^2.3.0:
5581 5666
   version "2.3.1"
5582 5667
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01"
5583 5668
   integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==