├── .gitignore ├── .npmignore ├── .prettierrc ├── .vscode └── extensions.json ├── README.md ├── index.html ├── lib ├── Gradient.js ├── index.d.ts └── index.js ├── package.json ├── public └── favicon.png ├── src ├── App.vue ├── assets │ └── logo.png ├── components │ ├── editor.vue │ ├── jscode.js │ └── script.js ├── env.d.ts └── main.ts ├── tsconfig.json ├── vite.config.ts └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | dist 4 | dist-ssr 5 | *.local 6 | .vscode -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | src 2 | .vscode 3 | public -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "tabWidth": 2, 3 | "useTabs": false 4 | } 5 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["johnsoncodehk.volar"] 3 | } 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Whatamesh 2 | 3 | Easily create mesh gradients like Stripe. 4 | 5 | This project wouldn't be possible without stripe and https://kevinhufnagl.com/ 6 | 7 | ## Live Demo 8 | 9 | [https://whatamesh.vercel.app/](https://whatamesh.vercel.app/) 10 | 11 | ## Getting started 12 | 13 | ### Creating your first gradient 14 | 15 | ```html 16 | 17 | ``` 18 | 19 | ```js 20 | import { Gradient } from "whatamesh"; 21 | 22 | const gradient = new Gradient(); 23 | gradient.initGradient("#gradient-canvas"); 24 | ``` 25 | 26 | ```css 27 | #gradient-canvas { 28 | width: 100%; 29 | height: 100%; 30 | --gradient-color-1: #449ce4; 31 | --gradient-color-2: #2f8bc1; 32 | --gradient-color-3: #ccbeee; 33 | --gradient-color-4: #4c57f6; 34 | } 35 | ``` 36 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | whatamesh 9 | 10 | 11 |
12 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /lib/Gradient.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Stripe WebGl Gradient Animation 3 | * All Credits to Stripe.com 4 | * ScrollObserver functionality to disable animation when not scrolled into view has been disabled and 5 | * commented out for now. 6 | * https://kevinhufnagl.com 7 | */ 8 | 9 | //Converting colors to proper format 10 | function normalizeColor(hexCode) { 11 | return [ 12 | ((hexCode >> 16) & 255) / 255, 13 | ((hexCode >> 8) & 255) / 255, 14 | (255 & hexCode) / 255, 15 | ]; 16 | } 17 | ["SCREEN", "LINEAR_LIGHT"].reduce( 18 | (hexCode, t, n) => 19 | Object.assign(hexCode, { 20 | [t]: n, 21 | }), 22 | {} 23 | ); 24 | 25 | //Essential functionality of WebGl 26 | //t = width 27 | //n = height 28 | class MiniGl { 29 | constructor(canvas, width, height, debug = false) { 30 | const _miniGl = this, 31 | debug_output = 32 | -1 !== document.location.search.toLowerCase().indexOf("debug=webgl"); 33 | (_miniGl.canvas = canvas), 34 | (_miniGl.gl = _miniGl.canvas.getContext("webgl", { 35 | antialias: true, 36 | })), 37 | (_miniGl.meshes = []); 38 | const context = _miniGl.gl; 39 | width && height && this.setSize(width, height), 40 | _miniGl.lastDebugMsg, 41 | (_miniGl.debug = 42 | debug && debug_output 43 | ? function (e) { 44 | const t = new Date(); 45 | t - _miniGl.lastDebugMsg > 1e3 && console.log("---"), 46 | console.log( 47 | t.toLocaleTimeString() + 48 | Array(Math.max(0, 32 - e.length)).join(" ") + 49 | e + 50 | ": ", 51 | ...Array.from(arguments).slice(1) 52 | ), 53 | (_miniGl.lastDebugMsg = t); 54 | } 55 | : () => {}), 56 | Object.defineProperties(_miniGl, { 57 | Material: { 58 | enumerable: false, 59 | value: class { 60 | constructor(vertexShaders, fragments, uniforms = {}) { 61 | const material = this; 62 | function getShaderByType(type, source) { 63 | const shader = context.createShader(type); 64 | return ( 65 | context.shaderSource(shader, source), 66 | context.compileShader(shader), 67 | context.getShaderParameter(shader, context.COMPILE_STATUS) || 68 | console.error(context.getShaderInfoLog(shader)), 69 | _miniGl.debug("Material.compileShaderSource", { 70 | source: source, 71 | }), 72 | shader 73 | ); 74 | } 75 | function getUniformVariableDeclarations(uniforms, type) { 76 | return Object.entries(uniforms) 77 | .map(([uniform, value]) => 78 | value.getDeclaration(uniform, type) 79 | ) 80 | .join("\n"); 81 | } 82 | (material.uniforms = uniforms), (material.uniformInstances = []); 83 | 84 | const prefix = 85 | "\n precision highp float;\n "; 86 | (material.vertexSource = `\n ${prefix}\n attribute vec4 position;\n attribute vec2 uv;\n attribute vec2 uvNorm;\n ${getUniformVariableDeclarations( 87 | _miniGl.commonUniforms, 88 | "vertex" 89 | )}\n ${getUniformVariableDeclarations( 90 | uniforms, 91 | "vertex" 92 | )}\n ${vertexShaders}\n `), 93 | (material.Source = `\n ${prefix}\n ${getUniformVariableDeclarations( 94 | _miniGl.commonUniforms, 95 | "fragment" 96 | )}\n ${getUniformVariableDeclarations( 97 | uniforms, 98 | "fragment" 99 | )}\n ${fragments}\n `), 100 | (material.vertexShader = getShaderByType( 101 | context.VERTEX_SHADER, 102 | material.vertexSource 103 | )), 104 | (material.fragmentShader = getShaderByType( 105 | context.FRAGMENT_SHADER, 106 | material.Source 107 | )), 108 | (material.program = context.createProgram()), 109 | context.attachShader(material.program, material.vertexShader), 110 | context.attachShader(material.program, material.fragmentShader), 111 | context.linkProgram(material.program), 112 | context.getProgramParameter( 113 | material.program, 114 | context.LINK_STATUS 115 | ) || console.error(context.getProgramInfoLog(material.program)), 116 | context.useProgram(material.program), 117 | material.attachUniforms(void 0, _miniGl.commonUniforms), 118 | material.attachUniforms(void 0, material.uniforms); 119 | } 120 | //t = uniform 121 | attachUniforms(name, uniforms) { 122 | //n = material 123 | const material = this; 124 | void 0 === name 125 | ? Object.entries(uniforms).forEach(([name, uniform]) => { 126 | material.attachUniforms(name, uniform); 127 | }) 128 | : "array" == uniforms.type 129 | ? uniforms.value.forEach((uniform, i) => 130 | material.attachUniforms(`${name}[${i}]`, uniform) 131 | ) 132 | : "struct" == uniforms.type 133 | ? Object.entries(uniforms.value).forEach(([uniform, i]) => 134 | material.attachUniforms(`${name}.${uniform}`, i) 135 | ) 136 | : (_miniGl.debug("Material.attachUniforms", { 137 | name: name, 138 | uniform: uniforms, 139 | }), 140 | material.uniformInstances.push({ 141 | uniform: uniforms, 142 | location: context.getUniformLocation( 143 | material.program, 144 | name 145 | ), 146 | })); 147 | } 148 | }, 149 | }, 150 | Uniform: { 151 | enumerable: !1, 152 | value: class { 153 | constructor(e) { 154 | (this.type = "float"), Object.assign(this, e); 155 | (this.typeFn = 156 | { 157 | float: "1f", 158 | int: "1i", 159 | vec2: "2fv", 160 | vec3: "3fv", 161 | vec4: "4fv", 162 | mat4: "Matrix4fv", 163 | }[this.type] || "1f"), 164 | this.update(); 165 | } 166 | update(value) { 167 | void 0 !== this.value && 168 | context[`uniform${this.typeFn}`]( 169 | value, 170 | 0 === this.typeFn.indexOf("Matrix") 171 | ? this.transpose 172 | : this.value, 173 | 0 === this.typeFn.indexOf("Matrix") ? this.value : null 174 | ); 175 | } 176 | //e - name 177 | //t - type 178 | //n - length 179 | getDeclaration(name, type, length) { 180 | const uniform = this; 181 | if (uniform.excludeFrom !== type) { 182 | if ("array" === uniform.type) 183 | return ( 184 | uniform.value[0].getDeclaration( 185 | name, 186 | type, 187 | uniform.value.length 188 | ) + `\nconst int ${name}_length = ${uniform.value.length};` 189 | ); 190 | if ("struct" === uniform.type) { 191 | let name_no_prefix = name.replace("u_", ""); 192 | return ( 193 | (name_no_prefix = 194 | name_no_prefix.charAt(0).toUpperCase() + 195 | name_no_prefix.slice(1)), 196 | `uniform struct ${name_no_prefix} 197 | {\n` + 198 | Object.entries(uniform.value) 199 | .map(([name, uniform]) => 200 | uniform 201 | .getDeclaration(name, type) 202 | .replace(/^uniform/, "") 203 | ) 204 | .join("") + 205 | `\n} ${name}${length > 0 ? `[${length}]` : ""};` 206 | ); 207 | } 208 | return `uniform ${uniform.type} ${name}${ 209 | length > 0 ? `[${length}]` : "" 210 | };`; 211 | } 212 | } 213 | }, 214 | }, 215 | PlaneGeometry: { 216 | enumerable: !1, 217 | value: class { 218 | constructor(width, height, n, i, orientation) { 219 | context.createBuffer(), 220 | (this.attributes = { 221 | position: new _miniGl.Attribute({ 222 | target: context.ARRAY_BUFFER, 223 | size: 3, 224 | }), 225 | uv: new _miniGl.Attribute({ 226 | target: context.ARRAY_BUFFER, 227 | size: 2, 228 | }), 229 | uvNorm: new _miniGl.Attribute({ 230 | target: context.ARRAY_BUFFER, 231 | size: 2, 232 | }), 233 | index: new _miniGl.Attribute({ 234 | target: context.ELEMENT_ARRAY_BUFFER, 235 | size: 3, 236 | type: context.UNSIGNED_SHORT, 237 | }), 238 | }), 239 | this.setTopology(n, i), 240 | this.setSize(width, height, orientation); 241 | } 242 | setTopology(e = 1, t = 1) { 243 | const n = this; 244 | (n.xSegCount = e), 245 | (n.ySegCount = t), 246 | (n.vertexCount = (n.xSegCount + 1) * (n.ySegCount + 1)), 247 | (n.quadCount = n.xSegCount * n.ySegCount * 2), 248 | (n.attributes.uv.values = new Float32Array(2 * n.vertexCount)), 249 | (n.attributes.uvNorm.values = new Float32Array( 250 | 2 * n.vertexCount 251 | )), 252 | (n.attributes.index.values = new Uint16Array(3 * n.quadCount)); 253 | for (let e = 0; e <= n.ySegCount; e++) 254 | for (let t = 0; t <= n.xSegCount; t++) { 255 | const i = e * (n.xSegCount + 1) + t; 256 | if ( 257 | ((n.attributes.uv.values[2 * i] = t / n.xSegCount), 258 | (n.attributes.uv.values[2 * i + 1] = 1 - e / n.ySegCount), 259 | (n.attributes.uvNorm.values[2 * i] = 260 | (t / n.xSegCount) * 2 - 1), 261 | (n.attributes.uvNorm.values[2 * i + 1] = 262 | 1 - (e / n.ySegCount) * 2), 263 | t < n.xSegCount && e < n.ySegCount) 264 | ) { 265 | const s = e * n.xSegCount + t; 266 | (n.attributes.index.values[6 * s] = i), 267 | (n.attributes.index.values[6 * s + 1] = 268 | i + 1 + n.xSegCount), 269 | (n.attributes.index.values[6 * s + 2] = i + 1), 270 | (n.attributes.index.values[6 * s + 3] = i + 1), 271 | (n.attributes.index.values[6 * s + 4] = 272 | i + 1 + n.xSegCount), 273 | (n.attributes.index.values[6 * s + 5] = 274 | i + 2 + n.xSegCount); 275 | } 276 | } 277 | n.attributes.uv.update(), 278 | n.attributes.uvNorm.update(), 279 | n.attributes.index.update(), 280 | _miniGl.debug("Geometry.setTopology", { 281 | uv: n.attributes.uv, 282 | uvNorm: n.attributes.uvNorm, 283 | index: n.attributes.index, 284 | }); 285 | } 286 | setSize(width = 1, height = 1, orientation = "xz") { 287 | const geometry = this; 288 | (geometry.width = width), 289 | (geometry.height = height), 290 | (geometry.orientation = orientation), 291 | (geometry.attributes.position.values && 292 | geometry.attributes.position.values.length === 293 | 3 * geometry.vertexCount) || 294 | (geometry.attributes.position.values = new Float32Array( 295 | 3 * geometry.vertexCount 296 | )); 297 | const o = width / -2, 298 | r = height / -2, 299 | segment_width = width / geometry.xSegCount, 300 | segment_height = height / geometry.ySegCount; 301 | for (let yIndex = 0; yIndex <= geometry.ySegCount; yIndex++) { 302 | const t = r + yIndex * segment_height; 303 | for (let xIndex = 0; xIndex <= geometry.xSegCount; xIndex++) { 304 | const r = o + xIndex * segment_width, 305 | l = yIndex * (geometry.xSegCount + 1) + xIndex; 306 | (geometry.attributes.position.values[ 307 | 3 * l + "xyz".indexOf(orientation[0]) 308 | ] = r), 309 | (geometry.attributes.position.values[ 310 | 3 * l + "xyz".indexOf(orientation[1]) 311 | ] = -t); 312 | } 313 | } 314 | geometry.attributes.position.update(), 315 | _miniGl.debug("Geometry.setSize", { 316 | position: geometry.attributes.position, 317 | }); 318 | } 319 | }, 320 | }, 321 | Mesh: { 322 | enumerable: !1, 323 | value: class { 324 | constructor(geometry, material) { 325 | const mesh = this; 326 | (mesh.geometry = geometry), 327 | (mesh.material = material), 328 | (mesh.wireframe = !1), 329 | (mesh.attributeInstances = []), 330 | Object.entries(mesh.geometry.attributes).forEach( 331 | ([e, attribute]) => { 332 | mesh.attributeInstances.push({ 333 | attribute: attribute, 334 | location: attribute.attach(e, mesh.material.program), 335 | }); 336 | } 337 | ), 338 | _miniGl.meshes.push(mesh), 339 | _miniGl.debug("Mesh.constructor", { 340 | mesh: mesh, 341 | }); 342 | } 343 | draw() { 344 | context.useProgram(this.material.program), 345 | this.material.uniformInstances.forEach( 346 | ({ uniform: e, location: t }) => e.update(t) 347 | ), 348 | this.attributeInstances.forEach( 349 | ({ attribute: e, location: t }) => e.use(t) 350 | ), 351 | context.drawElements( 352 | this.wireframe ? context.LINES : context.TRIANGLES, 353 | this.geometry.attributes.index.values.length, 354 | context.UNSIGNED_SHORT, 355 | 0 356 | ); 357 | } 358 | remove() { 359 | _miniGl.meshes = _miniGl.meshes.filter((e) => e != this); 360 | } 361 | }, 362 | }, 363 | Attribute: { 364 | enumerable: !1, 365 | value: class { 366 | constructor(e) { 367 | (this.type = context.FLOAT), 368 | (this.normalized = !1), 369 | (this.buffer = context.createBuffer()), 370 | Object.assign(this, e), 371 | this.update(); 372 | } 373 | update() { 374 | void 0 !== this.values && 375 | (context.bindBuffer(this.target, this.buffer), 376 | context.bufferData( 377 | this.target, 378 | this.values, 379 | context.STATIC_DRAW 380 | )); 381 | } 382 | attach(e, t) { 383 | const n = context.getAttribLocation(t, e); 384 | return ( 385 | this.target === context.ARRAY_BUFFER && 386 | (context.enableVertexAttribArray(n), 387 | context.vertexAttribPointer( 388 | n, 389 | this.size, 390 | this.type, 391 | this.normalized, 392 | 0, 393 | 0 394 | )), 395 | n 396 | ); 397 | } 398 | use(e) { 399 | context.bindBuffer(this.target, this.buffer), 400 | this.target === context.ARRAY_BUFFER && 401 | (context.enableVertexAttribArray(e), 402 | context.vertexAttribPointer( 403 | e, 404 | this.size, 405 | this.type, 406 | this.normalized, 407 | 0, 408 | 0 409 | )); 410 | } 411 | }, 412 | }, 413 | }); 414 | const a = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]; 415 | _miniGl.commonUniforms = { 416 | projectionMatrix: new _miniGl.Uniform({ 417 | type: "mat4", 418 | value: a, 419 | }), 420 | modelViewMatrix: new _miniGl.Uniform({ 421 | type: "mat4", 422 | value: a, 423 | }), 424 | resolution: new _miniGl.Uniform({ 425 | type: "vec2", 426 | value: [1, 1], 427 | }), 428 | aspectRatio: new _miniGl.Uniform({ 429 | type: "float", 430 | value: 1, 431 | }), 432 | }; 433 | } 434 | setSize(e = 640, t = 480) { 435 | (this.width = e), 436 | (this.height = t), 437 | (this.canvas.width = e), 438 | (this.canvas.height = t), 439 | this.gl.viewport(0, 0, e, t), 440 | (this.commonUniforms.resolution.value = [e, t]), 441 | (this.commonUniforms.aspectRatio.value = e / t), 442 | this.debug("MiniGL.setSize", { 443 | width: e, 444 | height: t, 445 | }); 446 | } 447 | //left, right, top, bottom, near, far 448 | setOrthographicCamera(e = 0, t = 0, n = 0, i = -2e3, s = 2e3) { 449 | (this.commonUniforms.projectionMatrix.value = [ 450 | 2 / this.width, 451 | 0, 452 | 0, 453 | 0, 454 | 0, 455 | 2 / this.height, 456 | 0, 457 | 0, 458 | 0, 459 | 0, 460 | 2 / (i - s), 461 | 0, 462 | e, 463 | t, 464 | n, 465 | 1, 466 | ]), 467 | this.debug( 468 | "setOrthographicCamera", 469 | this.commonUniforms.projectionMatrix.value 470 | ); 471 | } 472 | render() { 473 | this.gl.clearColor(0, 0, 0, 0), 474 | this.gl.clearDepth(1), 475 | this.meshes.forEach((e) => e.draw()); 476 | } 477 | } 478 | 479 | //Sets initial properties 480 | function e(object, propertyName, val) { 481 | return ( 482 | propertyName in object 483 | ? Object.defineProperty(object, propertyName, { 484 | value: val, 485 | enumerable: !0, 486 | configurable: !0, 487 | writable: !0, 488 | }) 489 | : (object[propertyName] = val), 490 | object 491 | ); 492 | } 493 | 494 | //Gradient object 495 | class Gradient { 496 | constructor(...t) { 497 | e(this, "el", void 0), 498 | e(this, "cssVarRetries", 0), 499 | e(this, "maxCssVarRetries", 200), 500 | e(this, "angle", 0), 501 | e(this, "isLoadedClass", !1), 502 | e(this, "isScrolling", !1), 503 | /*e(this, "isStatic", o.disableAmbientAnimations()),*/ e( 504 | this, 505 | "scrollingTimeout", 506 | void 0 507 | ), 508 | e(this, "scrollingRefreshDelay", 200), 509 | e(this, "isIntersecting", !1), 510 | e(this, "shaderFiles", void 0), 511 | e(this, "vertexShader", void 0), 512 | e(this, "sectionColors", void 0), 513 | e(this, "computedCanvasStyle", void 0), 514 | e(this, "conf", void 0), 515 | e(this, "uniforms", void 0), 516 | e(this, "t", 1253106), 517 | e(this, "last", 0), 518 | e(this, "width", void 0), 519 | e(this, "minWidth", 1111), 520 | e(this, "height", 600), 521 | e(this, "xSegCount", void 0), 522 | e(this, "ySegCount", void 0), 523 | e(this, "mesh", void 0), 524 | e(this, "material", void 0), 525 | e(this, "geometry", void 0), 526 | e(this, "minigl", void 0), 527 | e(this, "scrollObserver", void 0), 528 | e(this, "amp", 320), 529 | e(this, "seed", 5), 530 | e(this, "freqX", 14e-5), 531 | e(this, "freqY", 29e-5), 532 | e(this, "freqDelta", 1e-5), 533 | e(this, "activeColors", [1, 1, 1, 1]), 534 | e(this, "isMetaKey", !1), 535 | e(this, "isGradientLegendVisible", !1), 536 | e(this, "isMouseDown", !1), 537 | e(this, "handleScroll", () => { 538 | clearTimeout(this.scrollingTimeout), 539 | (this.scrollingTimeout = setTimeout( 540 | this.handleScrollEnd, 541 | this.scrollingRefreshDelay 542 | )), 543 | this.isGradientLegendVisible && this.hideGradientLegend(), 544 | this.conf.playing && ((this.isScrolling = !0), this.pause()); 545 | }), 546 | e(this, "handleScrollEnd", () => { 547 | (this.isScrolling = !1), this.isIntersecting && this.play(); 548 | }), 549 | e(this, "resize", () => { 550 | (this.width = window.innerWidth), 551 | this.minigl.setSize(this.width, this.height), 552 | this.minigl.setOrthographicCamera(), 553 | (this.xSegCount = Math.ceil(this.width * this.conf.density[0])), 554 | (this.ySegCount = Math.ceil(this.height * this.conf.density[1])), 555 | this.mesh.geometry.setTopology(this.xSegCount, this.ySegCount), 556 | this.mesh.geometry.setSize(this.width, this.height), 557 | (this.mesh.material.uniforms.u_shadow_power.value = 558 | this.width < 600 ? 5 : 6); 559 | }), 560 | e(this, "handleMouseDown", (e) => { 561 | this.isGradientLegendVisible && 562 | ((this.isMetaKey = e.metaKey), 563 | (this.isMouseDown = !0), 564 | !1 === this.conf.playing && requestAnimationFrame(this.animate)); 565 | }), 566 | e(this, "handleMouseUp", () => { 567 | this.isMouseDown = !1; 568 | }), 569 | e(this, "animate", (e) => { 570 | if (!this.shouldSkipFrame(e) || this.isMouseDown) { 571 | if ( 572 | ((this.t += Math.min(e - this.last, 1e3 / 15)), 573 | (this.last = e), 574 | this.isMouseDown) 575 | ) { 576 | let e = 160; 577 | this.isMetaKey && (e = -160), (this.t += e); 578 | } 579 | (this.mesh.material.uniforms.u_time.value = this.t), 580 | this.minigl.render(); 581 | } 582 | if (0 !== this.last && this.isStatic) 583 | return this.minigl.render(), void this.disconnect(); 584 | /*this.isIntersecting && */ (this.conf.playing || this.isMouseDown) && 585 | requestAnimationFrame(this.animate); 586 | }), 587 | e(this, "addIsLoadedClass", () => { 588 | /*this.isIntersecting && */ !this.isLoadedClass && 589 | ((this.isLoadedClass = !0), 590 | this.el.classList.add("isLoaded"), 591 | setTimeout(() => { 592 | this.el.parentElement.classList.add("isLoaded"); 593 | }, 3e3)); 594 | }), 595 | e(this, "pause", () => { 596 | this.conf.playing = false; 597 | }), 598 | e(this, "play", () => { 599 | requestAnimationFrame(this.animate), (this.conf.playing = true); 600 | }), 601 | e(this, "initGradient", (selector) => { 602 | this.el = document.querySelector(selector); 603 | this.connect(); 604 | return this; 605 | }); 606 | } 607 | async connect() { 608 | (this.shaderFiles = { 609 | vertex: 610 | "varying vec3 v_color;\n\nvoid main() {\n float time = u_time * u_global.noiseSpeed;\n\n vec2 noiseCoord = resolution * uvNorm * u_global.noiseFreq;\n\n vec2 st = 1. - uvNorm.xy;\n\n //\n // Tilting the plane\n //\n\n // Front-to-back tilt\n float tilt = resolution.y / 2.0 * uvNorm.y;\n\n // Left-to-right angle\n float incline = resolution.x * uvNorm.x / 2.0 * u_vertDeform.incline;\n\n // Up-down shift to offset incline\n float offset = resolution.x / 2.0 * u_vertDeform.incline * mix(u_vertDeform.offsetBottom, u_vertDeform.offsetTop, uv.y);\n\n //\n // Vertex noise\n //\n\n float noise = snoise(vec3(\n noiseCoord.x * u_vertDeform.noiseFreq.x + time * u_vertDeform.noiseFlow,\n noiseCoord.y * u_vertDeform.noiseFreq.y,\n time * u_vertDeform.noiseSpeed + u_vertDeform.noiseSeed\n )) * u_vertDeform.noiseAmp;\n\n // Fade noise to zero at edges\n noise *= 1.0 - pow(abs(uvNorm.y), 2.0);\n\n // Clamp to 0\n noise = max(0.0, noise);\n\n vec3 pos = vec3(\n position.x,\n position.y + tilt + incline + noise - offset,\n position.z\n );\n\n //\n // Vertex color, to be passed to fragment shader\n //\n\n if (u_active_colors[0] == 1.) {\n v_color = u_baseColor;\n }\n\n for (int i = 0; i < u_waveLayers_length; i++) {\n if (u_active_colors[i + 1] == 1.) {\n WaveLayers layer = u_waveLayers[i];\n\n float noise = smoothstep(\n layer.noiseFloor,\n layer.noiseCeil,\n snoise(vec3(\n noiseCoord.x * layer.noiseFreq.x + time * layer.noiseFlow,\n noiseCoord.y * layer.noiseFreq.y,\n time * layer.noiseSpeed + layer.noiseSeed\n )) / 2.0 + 0.5\n );\n\n v_color = blendNormal(v_color, layer.color, pow(noise, 4.));\n }\n }\n\n //\n // Finish\n //\n\n gl_Position = projectionMatrix * modelViewMatrix * vec4(pos, 1.0);\n}", 611 | noise: 612 | "//\n// Description : Array and textureless GLSL 2D/3D/4D simplex\n// noise functions.\n// Author : Ian McEwan, Ashima Arts.\n// Maintainer : stegu\n// Lastmod : 20110822 (ijm)\n// License : Copyright (C) 2011 Ashima Arts. All rights reserved.\n// Distributed under the MIT License. See LICENSE file.\n// https://github.com/ashima/webgl-noise\n// https://github.com/stegu/webgl-noise\n//\n\nvec3 mod289(vec3 x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\n\nvec4 mod289(vec4 x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\n\nvec4 permute(vec4 x) {\n return mod289(((x*34.0)+1.0)*x);\n}\n\nvec4 taylorInvSqrt(vec4 r)\n{\n return 1.79284291400159 - 0.85373472095314 * r;\n}\n\nfloat snoise(vec3 v)\n{\n const vec2 C = vec2(1.0/6.0, 1.0/3.0) ;\n const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);\n\n// First corner\n vec3 i = floor(v + dot(v, C.yyy) );\n vec3 x0 = v - i + dot(i, C.xxx) ;\n\n// Other corners\n vec3 g = step(x0.yzx, x0.xyz);\n vec3 l = 1.0 - g;\n vec3 i1 = min( g.xyz, l.zxy );\n vec3 i2 = max( g.xyz, l.zxy );\n\n // x0 = x0 - 0.0 + 0.0 * C.xxx;\n // x1 = x0 - i1 + 1.0 * C.xxx;\n // x2 = x0 - i2 + 2.0 * C.xxx;\n // x3 = x0 - 1.0 + 3.0 * C.xxx;\n vec3 x1 = x0 - i1 + C.xxx;\n vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y\n vec3 x3 = x0 - D.yyy; // -1.0+3.0*C.x = -0.5 = -D.y\n\n// Permutations\n i = mod289(i);\n vec4 p = permute( permute( permute(\n i.z + vec4(0.0, i1.z, i2.z, 1.0 ))\n + i.y + vec4(0.0, i1.y, i2.y, 1.0 ))\n + i.x + vec4(0.0, i1.x, i2.x, 1.0 ));\n\n// Gradients: 7x7 points over a square, mapped onto an octahedron.\n// The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)\n float n_ = 0.142857142857; // 1.0/7.0\n vec3 ns = n_ * D.wyz - D.xzx;\n\n vec4 j = p - 49.0 * floor(p * ns.z * ns.z); // mod(p,7*7)\n\n vec4 x_ = floor(j * ns.z);\n vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N)\n\n vec4 x = x_ *ns.x + ns.yyyy;\n vec4 y = y_ *ns.x + ns.yyyy;\n vec4 h = 1.0 - abs(x) - abs(y);\n\n vec4 b0 = vec4( x.xy, y.xy );\n vec4 b1 = vec4( x.zw, y.zw );\n\n //vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0;\n //vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0;\n vec4 s0 = floor(b0)*2.0 + 1.0;\n vec4 s1 = floor(b1)*2.0 + 1.0;\n vec4 sh = -step(h, vec4(0.0));\n\n vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;\n vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;\n\n vec3 p0 = vec3(a0.xy,h.x);\n vec3 p1 = vec3(a0.zw,h.y);\n vec3 p2 = vec3(a1.xy,h.z);\n vec3 p3 = vec3(a1.zw,h.w);\n\n//Normalise gradients\n vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\n p0 *= norm.x;\n p1 *= norm.y;\n p2 *= norm.z;\n p3 *= norm.w;\n\n// Mix final noise value\n vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);\n m = m * m;\n return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1),\n dot(p2,x2), dot(p3,x3) ) );\n}", 613 | blend: 614 | "//\n// https://github.com/jamieowen/glsl-blend\n//\n\n// Normal\n\nvec3 blendNormal(vec3 base, vec3 blend) {\n\treturn blend;\n}\n\nvec3 blendNormal(vec3 base, vec3 blend, float opacity) {\n\treturn (blendNormal(base, blend) * opacity + base * (1.0 - opacity));\n}\n\n// Screen\n\nfloat blendScreen(float base, float blend) {\n\treturn 1.0-((1.0-base)*(1.0-blend));\n}\n\nvec3 blendScreen(vec3 base, vec3 blend) {\n\treturn vec3(blendScreen(base.r,blend.r),blendScreen(base.g,blend.g),blendScreen(base.b,blend.b));\n}\n\nvec3 blendScreen(vec3 base, vec3 blend, float opacity) {\n\treturn (blendScreen(base, blend) * opacity + base * (1.0 - opacity));\n}\n\n// Multiply\n\nvec3 blendMultiply(vec3 base, vec3 blend) {\n\treturn base*blend;\n}\n\nvec3 blendMultiply(vec3 base, vec3 blend, float opacity) {\n\treturn (blendMultiply(base, blend) * opacity + base * (1.0 - opacity));\n}\n\n// Overlay\n\nfloat blendOverlay(float base, float blend) {\n\treturn base<0.5?(2.0*base*blend):(1.0-2.0*(1.0-base)*(1.0-blend));\n}\n\nvec3 blendOverlay(vec3 base, vec3 blend) {\n\treturn vec3(blendOverlay(base.r,blend.r),blendOverlay(base.g,blend.g),blendOverlay(base.b,blend.b));\n}\n\nvec3 blendOverlay(vec3 base, vec3 blend, float opacity) {\n\treturn (blendOverlay(base, blend) * opacity + base * (1.0 - opacity));\n}\n\n// Hard light\n\nvec3 blendHardLight(vec3 base, vec3 blend) {\n\treturn blendOverlay(blend,base);\n}\n\nvec3 blendHardLight(vec3 base, vec3 blend, float opacity) {\n\treturn (blendHardLight(base, blend) * opacity + base * (1.0 - opacity));\n}\n\n// Soft light\n\nfloat blendSoftLight(float base, float blend) {\n\treturn (blend<0.5)?(2.0*base*blend+base*base*(1.0-2.0*blend)):(sqrt(base)*(2.0*blend-1.0)+2.0*base*(1.0-blend));\n}\n\nvec3 blendSoftLight(vec3 base, vec3 blend) {\n\treturn vec3(blendSoftLight(base.r,blend.r),blendSoftLight(base.g,blend.g),blendSoftLight(base.b,blend.b));\n}\n\nvec3 blendSoftLight(vec3 base, vec3 blend, float opacity) {\n\treturn (blendSoftLight(base, blend) * opacity + base * (1.0 - opacity));\n}\n\n// Color dodge\n\nfloat blendColorDodge(float base, float blend) {\n\treturn (blend==1.0)?blend:min(base/(1.0-blend),1.0);\n}\n\nvec3 blendColorDodge(vec3 base, vec3 blend) {\n\treturn vec3(blendColorDodge(base.r,blend.r),blendColorDodge(base.g,blend.g),blendColorDodge(base.b,blend.b));\n}\n\nvec3 blendColorDodge(vec3 base, vec3 blend, float opacity) {\n\treturn (blendColorDodge(base, blend) * opacity + base * (1.0 - opacity));\n}\n\n// Color burn\n\nfloat blendColorBurn(float base, float blend) {\n\treturn (blend==0.0)?blend:max((1.0-((1.0-base)/blend)),0.0);\n}\n\nvec3 blendColorBurn(vec3 base, vec3 blend) {\n\treturn vec3(blendColorBurn(base.r,blend.r),blendColorBurn(base.g,blend.g),blendColorBurn(base.b,blend.b));\n}\n\nvec3 blendColorBurn(vec3 base, vec3 blend, float opacity) {\n\treturn (blendColorBurn(base, blend) * opacity + base * (1.0 - opacity));\n}\n\n// Vivid Light\n\nfloat blendVividLight(float base, float blend) {\n\treturn (blend<0.5)?blendColorBurn(base,(2.0*blend)):blendColorDodge(base,(2.0*(blend-0.5)));\n}\n\nvec3 blendVividLight(vec3 base, vec3 blend) {\n\treturn vec3(blendVividLight(base.r,blend.r),blendVividLight(base.g,blend.g),blendVividLight(base.b,blend.b));\n}\n\nvec3 blendVividLight(vec3 base, vec3 blend, float opacity) {\n\treturn (blendVividLight(base, blend) * opacity + base * (1.0 - opacity));\n}\n\n// Lighten\n\nfloat blendLighten(float base, float blend) {\n\treturn max(blend,base);\n}\n\nvec3 blendLighten(vec3 base, vec3 blend) {\n\treturn vec3(blendLighten(base.r,blend.r),blendLighten(base.g,blend.g),blendLighten(base.b,blend.b));\n}\n\nvec3 blendLighten(vec3 base, vec3 blend, float opacity) {\n\treturn (blendLighten(base, blend) * opacity + base * (1.0 - opacity));\n}\n\n// Linear burn\n\nfloat blendLinearBurn(float base, float blend) {\n\t// Note : Same implementation as BlendSubtractf\n\treturn max(base+blend-1.0,0.0);\n}\n\nvec3 blendLinearBurn(vec3 base, vec3 blend) {\n\t// Note : Same implementation as BlendSubtract\n\treturn max(base+blend-vec3(1.0),vec3(0.0));\n}\n\nvec3 blendLinearBurn(vec3 base, vec3 blend, float opacity) {\n\treturn (blendLinearBurn(base, blend) * opacity + base * (1.0 - opacity));\n}\n\n// Linear dodge\n\nfloat blendLinearDodge(float base, float blend) {\n\t// Note : Same implementation as BlendAddf\n\treturn min(base+blend,1.0);\n}\n\nvec3 blendLinearDodge(vec3 base, vec3 blend) {\n\t// Note : Same implementation as BlendAdd\n\treturn min(base+blend,vec3(1.0));\n}\n\nvec3 blendLinearDodge(vec3 base, vec3 blend, float opacity) {\n\treturn (blendLinearDodge(base, blend) * opacity + base * (1.0 - opacity));\n}\n\n// Linear light\n\nfloat blendLinearLight(float base, float blend) {\n\treturn blend<0.5?blendLinearBurn(base,(2.0*blend)):blendLinearDodge(base,(2.0*(blend-0.5)));\n}\n\nvec3 blendLinearLight(vec3 base, vec3 blend) {\n\treturn vec3(blendLinearLight(base.r,blend.r),blendLinearLight(base.g,blend.g),blendLinearLight(base.b,blend.b));\n}\n\nvec3 blendLinearLight(vec3 base, vec3 blend, float opacity) {\n\treturn (blendLinearLight(base, blend) * opacity + base * (1.0 - opacity));\n}", 615 | fragment: 616 | "varying vec3 v_color;\n\nvoid main() {\n vec3 color = v_color;\n if (u_darken_top == 1.0) {\n vec2 st = gl_FragCoord.xy/resolution.xy;\n color.g -= pow(st.y + sin(-12.0) * st.x, u_shadow_power) * 0.4;\n }\n gl_FragColor = vec4(color, 1.0);\n}", 617 | }), 618 | (this.conf = { 619 | presetName: "", 620 | wireframe: false, 621 | density: [0.06, 0.16], 622 | zoom: 1, 623 | rotation: 0, 624 | playing: true, 625 | }), 626 | document.querySelectorAll("canvas").length < 1 627 | ? console.log("DID NOT LOAD HERO STRIPE CANVAS") 628 | : ((this.minigl = new MiniGl(this.el, null, null, !0)), 629 | requestAnimationFrame(() => { 630 | this.el && 631 | ((this.computedCanvasStyle = getComputedStyle(this.el)), 632 | this.waitForCssVars()); 633 | })); 634 | /* 635 | this.scrollObserver = await s.create(.1, !1), 636 | this.scrollObserver.observe(this.el), 637 | this.scrollObserver.onSeparate(() => { 638 | window.removeEventListener("scroll", this.handleScroll), window.removeEventListener("mousedown", this.handleMouseDown), window.removeEventListener("mouseup", this.handleMouseUp), window.removeEventListener("keydown", this.handleKeyDown), this.isIntersecting = !1, this.conf.playing && this.pause() 639 | }), 640 | this.scrollObserver.onIntersect(() => { 641 | window.addEventListener("scroll", this.handleScroll), window.addEventListener("mousedown", this.handleMouseDown), window.addEventListener("mouseup", this.handleMouseUp), window.addEventListener("keydown", this.handleKeyDown), this.isIntersecting = !0, this.addIsLoadedClass(), this.play() 642 | })*/ 643 | } 644 | disconnect() { 645 | this.scrollObserver && 646 | (window.removeEventListener("scroll", this.handleScroll), 647 | window.removeEventListener("mousedown", this.handleMouseDown), 648 | window.removeEventListener("mouseup", this.handleMouseUp), 649 | window.removeEventListener("keydown", this.handleKeyDown), 650 | this.scrollObserver.disconnect()), 651 | window.removeEventListener("resize", this.resize); 652 | } 653 | initMaterial() { 654 | this.uniforms = { 655 | u_time: new this.minigl.Uniform({ 656 | value: 0, 657 | }), 658 | u_shadow_power: new this.minigl.Uniform({ 659 | value: 5, 660 | }), 661 | u_darken_top: new this.minigl.Uniform({ 662 | value: "" === this.el.dataset.jsDarkenTop ? 1 : 0, 663 | }), 664 | u_active_colors: new this.minigl.Uniform({ 665 | value: this.activeColors, 666 | type: "vec4", 667 | }), 668 | u_global: new this.minigl.Uniform({ 669 | value: { 670 | noiseFreq: new this.minigl.Uniform({ 671 | value: [this.freqX, this.freqY], 672 | type: "vec2", 673 | }), 674 | noiseSpeed: new this.minigl.Uniform({ 675 | value: 5e-6, 676 | }), 677 | }, 678 | type: "struct", 679 | }), 680 | u_vertDeform: new this.minigl.Uniform({ 681 | value: { 682 | incline: new this.minigl.Uniform({ 683 | value: Math.sin(this.angle) / Math.cos(this.angle), 684 | }), 685 | offsetTop: new this.minigl.Uniform({ 686 | value: -0.5, 687 | }), 688 | offsetBottom: new this.minigl.Uniform({ 689 | value: -0.5, 690 | }), 691 | noiseFreq: new this.minigl.Uniform({ 692 | value: [3, 4], 693 | type: "vec2", 694 | }), 695 | noiseAmp: new this.minigl.Uniform({ 696 | value: this.amp, 697 | }), 698 | noiseSpeed: new this.minigl.Uniform({ 699 | value: 10, 700 | }), 701 | noiseFlow: new this.minigl.Uniform({ 702 | value: 3, 703 | }), 704 | noiseSeed: new this.minigl.Uniform({ 705 | value: this.seed, 706 | }), 707 | }, 708 | type: "struct", 709 | excludeFrom: "fragment", 710 | }), 711 | u_baseColor: new this.minigl.Uniform({ 712 | value: this.sectionColors[0], 713 | type: "vec3", 714 | excludeFrom: "fragment", 715 | }), 716 | u_waveLayers: new this.minigl.Uniform({ 717 | value: [], 718 | excludeFrom: "fragment", 719 | type: "array", 720 | }), 721 | }; 722 | for (let e = 1; e < this.sectionColors.length; e += 1) 723 | this.uniforms.u_waveLayers.value.push( 724 | new this.minigl.Uniform({ 725 | value: { 726 | color: new this.minigl.Uniform({ 727 | value: this.sectionColors[e], 728 | type: "vec3", 729 | }), 730 | noiseFreq: new this.minigl.Uniform({ 731 | value: [ 732 | 2 + e / this.sectionColors.length, 733 | 3 + e / this.sectionColors.length, 734 | ], 735 | type: "vec2", 736 | }), 737 | noiseSpeed: new this.minigl.Uniform({ 738 | value: 11 + 0.3 * e, 739 | }), 740 | noiseFlow: new this.minigl.Uniform({ 741 | value: 6.5 + 0.3 * e, 742 | }), 743 | noiseSeed: new this.minigl.Uniform({ 744 | value: this.seed + 10 * e, 745 | }), 746 | noiseFloor: new this.minigl.Uniform({ 747 | value: 0.1, 748 | }), 749 | noiseCeil: new this.minigl.Uniform({ 750 | value: 0.63 + 0.07 * e, 751 | }), 752 | }, 753 | type: "struct", 754 | }) 755 | ); 756 | return ( 757 | (this.vertexShader = [ 758 | this.shaderFiles.noise, 759 | this.shaderFiles.blend, 760 | this.shaderFiles.vertex, 761 | ].join("\n\n")), 762 | new this.minigl.Material( 763 | this.vertexShader, 764 | this.shaderFiles.fragment, 765 | this.uniforms 766 | ) 767 | ); 768 | } 769 | initMesh() { 770 | (this.material = this.initMaterial()), 771 | (this.geometry = new this.minigl.PlaneGeometry()), 772 | (this.mesh = new this.minigl.Mesh(this.geometry, this.material)); 773 | } 774 | shouldSkipFrame(e) { 775 | return ( 776 | !!window.document.hidden || 777 | !this.conf.playing || 778 | parseInt(e, 10) % 2 == 0 || 779 | void 0 780 | ); 781 | } 782 | updateFrequency(e) { 783 | (this.freqX += e), (this.freqY += e); 784 | } 785 | toggleColor(index) { 786 | this.activeColors[index] = 0 === this.activeColors[index] ? 1 : 0; 787 | } 788 | showGradientLegend() { 789 | this.width > this.minWidth && 790 | ((this.isGradientLegendVisible = !0), 791 | document.body.classList.add("isGradientLegendVisible")); 792 | } 793 | hideGradientLegend() { 794 | (this.isGradientLegendVisible = !1), 795 | document.body.classList.remove("isGradientLegendVisible"); 796 | } 797 | init() { 798 | this.initGradientColors(), 799 | this.initMesh(), 800 | this.resize(), 801 | requestAnimationFrame(this.animate), 802 | window.addEventListener("resize", this.resize); 803 | } 804 | /* 805 | * Waiting for the css variables to become available, usually on page load before we can continue. 806 | * Using default colors assigned below if no variables have been found after maxCssVarRetries 807 | */ 808 | waitForCssVars() { 809 | if ( 810 | this.computedCanvasStyle && 811 | -1 !== 812 | this.computedCanvasStyle 813 | .getPropertyValue("--gradient-color-1") 814 | .indexOf("#") 815 | ) 816 | this.init(), this.addIsLoadedClass(); 817 | else { 818 | if ( 819 | ((this.cssVarRetries += 1), this.cssVarRetries > this.maxCssVarRetries) 820 | ) { 821 | return ( 822 | (this.sectionColors = [16711680, 16711680, 16711935, 65280, 255]), 823 | void this.init() 824 | ); 825 | } 826 | requestAnimationFrame(() => this.waitForCssVars()); 827 | } 828 | } 829 | /* 830 | * Initializes the four section colors by retrieving them from css variables. 831 | */ 832 | initGradientColors() { 833 | this.sectionColors = [ 834 | "--gradient-color-1", 835 | "--gradient-color-2", 836 | "--gradient-color-3", 837 | "--gradient-color-4", 838 | ] 839 | .map((cssPropertyName) => { 840 | let hex = this.computedCanvasStyle 841 | .getPropertyValue(cssPropertyName) 842 | .trim(); 843 | //Check if shorthand hex value was used and double the length so the conversion in normalizeColor will work. 844 | if (4 === hex.length) { 845 | const hexTemp = hex 846 | .substr(1) 847 | .split("") 848 | .map((hexTemp) => hexTemp + hexTemp) 849 | .join(""); 850 | hex = `#${hexTemp}`; 851 | } 852 | return hex && `0x${hex.substr(1)}`; 853 | }) 854 | .filter(Boolean) 855 | .map(normalizeColor); 856 | } 857 | } 858 | 859 | /* 860 | *Finally initializing the Gradient class, assigning a canvas to it and calling Gradient.connect() which initializes everything, 861 | * Use Gradient.pause() and Gradient.play() for controls. 862 | * 863 | * Here are some default property values you can change anytime: 864 | * Amplitude: Gradient.amp = 0 865 | * Colors: Gradient.sectionColors (if you change colors, use normalizeColor(#hexValue)) before you assign it. 866 | * 867 | * 868 | * Useful functions 869 | * Gradient.toggleColor(index) 870 | * Gradient.updateFrequency(freq) 871 | */ 872 | // var gradient = new Gradient(); 873 | // gradient.initGradient("#gradient-canvas"); 874 | 875 | export { Gradient }; 876 | -------------------------------------------------------------------------------- /lib/index.d.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @example 3 | * // Create your instance 4 | * const gradient = new Gradient() 5 | * 6 | * // Call `initGradient` with the selector to your canvas 7 | * gradient.initGradient('#gradient-canvas') 8 | * @link https://whatamesh.vercel.app/ 9 | */ 10 | class Gradient { 11 | /** 12 | * Creates an instance of Gradient. 13 | * 14 | * @memberof Gradient 15 | */ 16 | constructor(); 17 | 18 | /** 19 | * Pauses the gradient animation. 20 | * 21 | * @memberof Gradient 22 | */ 23 | pause(): void; 24 | 25 | /** 26 | * Plays the gradient animation. 27 | * 28 | * @memberof Gradient 29 | */ 30 | play(): void; 31 | 32 | /** 33 | * Initializes the gradient with the provided selector. 34 | * 35 | * @param {string} selector - The selector to your canvas. 36 | * @memberof Gradient 37 | */ 38 | initGradient(selector: string): void; 39 | 40 | /** 41 | * Toggles the color at the specified index. 42 | * 43 | * @param {number} index - The index of the color to toggle. 44 | * @memberof Gradient 45 | */ 46 | toggleColor(index: number): void; 47 | 48 | /** 49 | * Shows the legend for the gradient. 50 | * 51 | * @memberof Gradient 52 | */ 53 | showGradientLegend(): void; 54 | 55 | /** 56 | * Hides the legend for the gradient. 57 | * 58 | * @memberof Gradient 59 | */ 60 | hideGradientLegend(): void; 61 | } 62 | 63 | export { Gradient }; 64 | -------------------------------------------------------------------------------- /lib/index.js: -------------------------------------------------------------------------------- 1 | export * from "./Gradient"; 2 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "whatamesh", 3 | "version": "0.2.0", 4 | "main": "./lib/index.js", 5 | "types": "./lib/index.d.ts", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vue-tsc --noEmit && vite build", 9 | "serve": "vite preview" 10 | }, 11 | "files": [ 12 | "lib" 13 | ], 14 | "repository": { 15 | "type": "git", 16 | "url": "https://github.com/jordienr/whatamesh" 17 | }, 18 | "devDependencies": { 19 | "vue": "^3.2.6", 20 | "sass": "^1.39.2", 21 | "@vitejs/plugin-vue": "^1.6.1", 22 | "@vue/compiler-sfc": "^3.2.6", 23 | "typescript": "^4.3.2", 24 | "vite": "^2.5.4", 25 | "vue-tsc": "^0.2.2", 26 | "vue3-clipboard": "^1.0.0" 27 | }, 28 | "dependencies": { 29 | "color-schemes-generator": "^1.0.1" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordienr/whatamesh/3dd627dfd1897e23df3cbef95bfe4bbd5ffc913b/public/favicon.png -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | 11 | 28 | -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordienr/whatamesh/3dd627dfd1897e23df3cbef95bfe4bbd5ffc913b/src/assets/logo.png -------------------------------------------------------------------------------- /src/components/editor.vue: -------------------------------------------------------------------------------- 1 | 89 | 90 | 195 | 196 | 303 | -------------------------------------------------------------------------------- /src/components/jscode.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jordienr/whatamesh/3dd627dfd1897e23df3cbef95bfe4bbd5ffc913b/src/components/jscode.js -------------------------------------------------------------------------------- /src/components/script.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Stripe WebGl Gradient Animation 3 | * All Credits to Stripe.com 4 | * ScrollObserver functionality to disable animation when not scrolled into view has been disabled and 5 | * commented out for now. 6 | * https://kevinhufnagl.com 7 | */ 8 | 9 | //Converting colors to proper format 10 | function normalizeColor(hexCode) { 11 | return [ 12 | ((hexCode >> 16) & 255) / 255, 13 | ((hexCode >> 8) & 255) / 255, 14 | (255 & hexCode) / 255, 15 | ]; 16 | } 17 | ["SCREEN", "LINEAR_LIGHT"].reduce( 18 | (hexCode, t, n) => 19 | Object.assign(hexCode, { 20 | [t]: n, 21 | }), 22 | {} 23 | ); 24 | 25 | //Essential functionality of WebGl 26 | //t = width 27 | //n = height 28 | class MiniGl { 29 | constructor(canvas, width, height, debug = false) { 30 | const _miniGl = this, 31 | debug_output = 32 | -1 !== document.location.search.toLowerCase().indexOf("debug=webgl"); 33 | (_miniGl.canvas = canvas), 34 | (_miniGl.gl = _miniGl.canvas.getContext("webgl", { 35 | antialias: true, 36 | })), 37 | (_miniGl.meshes = []); 38 | const context = _miniGl.gl; 39 | width && height && this.setSize(width, height), 40 | _miniGl.lastDebugMsg, 41 | (_miniGl.debug = 42 | debug && debug_output 43 | ? function (e) { 44 | const t = new Date(); 45 | t - _miniGl.lastDebugMsg > 1e3 && console.log("---"), 46 | console.log( 47 | t.toLocaleTimeString() + 48 | Array(Math.max(0, 32 - e.length)).join(" ") + 49 | e + 50 | ": ", 51 | ...Array.from(arguments).slice(1) 52 | ), 53 | (_miniGl.lastDebugMsg = t); 54 | } 55 | : () => {}), 56 | Object.defineProperties(_miniGl, { 57 | Material: { 58 | enumerable: false, 59 | value: class { 60 | constructor(vertexShaders, fragments, uniforms = {}) { 61 | const material = this; 62 | function getShaderByType(type, source) { 63 | const shader = context.createShader(type); 64 | return ( 65 | context.shaderSource(shader, source), 66 | context.compileShader(shader), 67 | context.getShaderParameter(shader, context.COMPILE_STATUS) || 68 | console.error(context.getShaderInfoLog(shader)), 69 | _miniGl.debug("Material.compileShaderSource", { 70 | source: source, 71 | }), 72 | shader 73 | ); 74 | } 75 | function getUniformVariableDeclarations(uniforms, type) { 76 | return Object.entries(uniforms) 77 | .map(([uniform, value]) => 78 | value.getDeclaration(uniform, type) 79 | ) 80 | .join("\n"); 81 | } 82 | (material.uniforms = uniforms), (material.uniformInstances = []); 83 | 84 | const prefix = 85 | "\n precision highp float;\n "; 86 | (material.vertexSource = `\n ${prefix}\n attribute vec4 position;\n attribute vec2 uv;\n attribute vec2 uvNorm;\n ${getUniformVariableDeclarations( 87 | _miniGl.commonUniforms, 88 | "vertex" 89 | )}\n ${getUniformVariableDeclarations( 90 | uniforms, 91 | "vertex" 92 | )}\n ${vertexShaders}\n `), 93 | (material.Source = `\n ${prefix}\n ${getUniformVariableDeclarations( 94 | _miniGl.commonUniforms, 95 | "fragment" 96 | )}\n ${getUniformVariableDeclarations( 97 | uniforms, 98 | "fragment" 99 | )}\n ${fragments}\n `), 100 | (material.vertexShader = getShaderByType( 101 | context.VERTEX_SHADER, 102 | material.vertexSource 103 | )), 104 | (material.fragmentShader = getShaderByType( 105 | context.FRAGMENT_SHADER, 106 | material.Source 107 | )), 108 | (material.program = context.createProgram()), 109 | context.attachShader(material.program, material.vertexShader), 110 | context.attachShader(material.program, material.fragmentShader), 111 | context.linkProgram(material.program), 112 | context.getProgramParameter( 113 | material.program, 114 | context.LINK_STATUS 115 | ) || console.error(context.getProgramInfoLog(material.program)), 116 | context.useProgram(material.program), 117 | material.attachUniforms(void 0, _miniGl.commonUniforms), 118 | material.attachUniforms(void 0, material.uniforms); 119 | } 120 | //t = uniform 121 | attachUniforms(name, uniforms) { 122 | //n = material 123 | const material = this; 124 | void 0 === name 125 | ? Object.entries(uniforms).forEach(([name, uniform]) => { 126 | material.attachUniforms(name, uniform); 127 | }) 128 | : "array" == uniforms.type 129 | ? uniforms.value.forEach((uniform, i) => 130 | material.attachUniforms(`${name}[${i}]`, uniform) 131 | ) 132 | : "struct" == uniforms.type 133 | ? Object.entries(uniforms.value).forEach(([uniform, i]) => 134 | material.attachUniforms(`${name}.${uniform}`, i) 135 | ) 136 | : (_miniGl.debug("Material.attachUniforms", { 137 | name: name, 138 | uniform: uniforms, 139 | }), 140 | material.uniformInstances.push({ 141 | uniform: uniforms, 142 | location: context.getUniformLocation( 143 | material.program, 144 | name 145 | ), 146 | })); 147 | } 148 | }, 149 | }, 150 | Uniform: { 151 | enumerable: !1, 152 | value: class { 153 | constructor(e) { 154 | (this.type = "float"), Object.assign(this, e); 155 | (this.typeFn = 156 | { 157 | float: "1f", 158 | int: "1i", 159 | vec2: "2fv", 160 | vec3: "3fv", 161 | vec4: "4fv", 162 | mat4: "Matrix4fv", 163 | }[this.type] || "1f"), 164 | this.update(); 165 | } 166 | update(value) { 167 | void 0 !== this.value && 168 | context[`uniform${this.typeFn}`]( 169 | value, 170 | 0 === this.typeFn.indexOf("Matrix") 171 | ? this.transpose 172 | : this.value, 173 | 0 === this.typeFn.indexOf("Matrix") ? this.value : null 174 | ); 175 | } 176 | //e - name 177 | //t - type 178 | //n - length 179 | getDeclaration(name, type, length) { 180 | const uniform = this; 181 | if (uniform.excludeFrom !== type) { 182 | if ("array" === uniform.type) 183 | return ( 184 | uniform.value[0].getDeclaration( 185 | name, 186 | type, 187 | uniform.value.length 188 | ) + `\nconst int ${name}_length = ${uniform.value.length};` 189 | ); 190 | if ("struct" === uniform.type) { 191 | let name_no_prefix = name.replace("u_", ""); 192 | return ( 193 | (name_no_prefix = 194 | name_no_prefix.charAt(0).toUpperCase() + 195 | name_no_prefix.slice(1)), 196 | `uniform struct ${name_no_prefix} 197 | {\n` + 198 | Object.entries(uniform.value) 199 | .map(([name, uniform]) => 200 | uniform 201 | .getDeclaration(name, type) 202 | .replace(/^uniform/, "") 203 | ) 204 | .join("") + 205 | `\n} ${name}${length > 0 ? `[${length}]` : ""};` 206 | ); 207 | } 208 | return `uniform ${uniform.type} ${name}${ 209 | length > 0 ? `[${length}]` : "" 210 | };`; 211 | } 212 | } 213 | }, 214 | }, 215 | PlaneGeometry: { 216 | enumerable: !1, 217 | value: class { 218 | constructor(width, height, n, i, orientation) { 219 | context.createBuffer(), 220 | (this.attributes = { 221 | position: new _miniGl.Attribute({ 222 | target: context.ARRAY_BUFFER, 223 | size: 3, 224 | }), 225 | uv: new _miniGl.Attribute({ 226 | target: context.ARRAY_BUFFER, 227 | size: 2, 228 | }), 229 | uvNorm: new _miniGl.Attribute({ 230 | target: context.ARRAY_BUFFER, 231 | size: 2, 232 | }), 233 | index: new _miniGl.Attribute({ 234 | target: context.ELEMENT_ARRAY_BUFFER, 235 | size: 3, 236 | type: context.UNSIGNED_SHORT, 237 | }), 238 | }), 239 | this.setTopology(n, i), 240 | this.setSize(width, height, orientation); 241 | } 242 | setTopology(e = 1, t = 1) { 243 | const n = this; 244 | (n.xSegCount = e), 245 | (n.ySegCount = t), 246 | (n.vertexCount = (n.xSegCount + 1) * (n.ySegCount + 1)), 247 | (n.quadCount = n.xSegCount * n.ySegCount * 2), 248 | (n.attributes.uv.values = new Float32Array(2 * n.vertexCount)), 249 | (n.attributes.uvNorm.values = new Float32Array( 250 | 2 * n.vertexCount 251 | )), 252 | (n.attributes.index.values = new Uint16Array(3 * n.quadCount)); 253 | for (let e = 0; e <= n.ySegCount; e++) 254 | for (let t = 0; t <= n.xSegCount; t++) { 255 | const i = e * (n.xSegCount + 1) + t; 256 | if ( 257 | ((n.attributes.uv.values[2 * i] = t / n.xSegCount), 258 | (n.attributes.uv.values[2 * i + 1] = 1 - e / n.ySegCount), 259 | (n.attributes.uvNorm.values[2 * i] = 260 | (t / n.xSegCount) * 2 - 1), 261 | (n.attributes.uvNorm.values[2 * i + 1] = 262 | 1 - (e / n.ySegCount) * 2), 263 | t < n.xSegCount && e < n.ySegCount) 264 | ) { 265 | const s = e * n.xSegCount + t; 266 | (n.attributes.index.values[6 * s] = i), 267 | (n.attributes.index.values[6 * s + 1] = 268 | i + 1 + n.xSegCount), 269 | (n.attributes.index.values[6 * s + 2] = i + 1), 270 | (n.attributes.index.values[6 * s + 3] = i + 1), 271 | (n.attributes.index.values[6 * s + 4] = 272 | i + 1 + n.xSegCount), 273 | (n.attributes.index.values[6 * s + 5] = 274 | i + 2 + n.xSegCount); 275 | } 276 | } 277 | n.attributes.uv.update(), 278 | n.attributes.uvNorm.update(), 279 | n.attributes.index.update(), 280 | _miniGl.debug("Geometry.setTopology", { 281 | uv: n.attributes.uv, 282 | uvNorm: n.attributes.uvNorm, 283 | index: n.attributes.index, 284 | }); 285 | } 286 | setSize(width = 1, height = 1, orientation = "xz") { 287 | const geometry = this; 288 | (geometry.width = width), 289 | (geometry.height = height), 290 | (geometry.orientation = orientation), 291 | (geometry.attributes.position.values && 292 | geometry.attributes.position.values.length === 293 | 3 * geometry.vertexCount) || 294 | (geometry.attributes.position.values = new Float32Array( 295 | 3 * geometry.vertexCount 296 | )); 297 | const o = width / -2, 298 | r = height / -2, 299 | segment_width = width / geometry.xSegCount, 300 | segment_height = height / geometry.ySegCount; 301 | for (let yIndex = 0; yIndex <= geometry.ySegCount; yIndex++) { 302 | const t = r + yIndex * segment_height; 303 | for (let xIndex = 0; xIndex <= geometry.xSegCount; xIndex++) { 304 | const r = o + xIndex * segment_width, 305 | l = yIndex * (geometry.xSegCount + 1) + xIndex; 306 | (geometry.attributes.position.values[ 307 | 3 * l + "xyz".indexOf(orientation[0]) 308 | ] = r), 309 | (geometry.attributes.position.values[ 310 | 3 * l + "xyz".indexOf(orientation[1]) 311 | ] = -t); 312 | } 313 | } 314 | geometry.attributes.position.update(), 315 | _miniGl.debug("Geometry.setSize", { 316 | position: geometry.attributes.position, 317 | }); 318 | } 319 | }, 320 | }, 321 | Mesh: { 322 | enumerable: !1, 323 | value: class { 324 | constructor(geometry, material) { 325 | const mesh = this; 326 | (mesh.geometry = geometry), 327 | (mesh.material = material), 328 | (mesh.wireframe = !1), 329 | (mesh.attributeInstances = []), 330 | Object.entries(mesh.geometry.attributes).forEach( 331 | ([e, attribute]) => { 332 | mesh.attributeInstances.push({ 333 | attribute: attribute, 334 | location: attribute.attach(e, mesh.material.program), 335 | }); 336 | } 337 | ), 338 | _miniGl.meshes.push(mesh), 339 | _miniGl.debug("Mesh.constructor", { 340 | mesh: mesh, 341 | }); 342 | } 343 | draw() { 344 | context.useProgram(this.material.program), 345 | this.material.uniformInstances.forEach( 346 | ({ uniform: e, location: t }) => e.update(t) 347 | ), 348 | this.attributeInstances.forEach( 349 | ({ attribute: e, location: t }) => e.use(t) 350 | ), 351 | context.drawElements( 352 | this.wireframe ? context.LINES : context.TRIANGLES, 353 | this.geometry.attributes.index.values.length, 354 | context.UNSIGNED_SHORT, 355 | 0 356 | ); 357 | } 358 | remove() { 359 | _miniGl.meshes = _miniGl.meshes.filter((e) => e != this); 360 | } 361 | }, 362 | }, 363 | Attribute: { 364 | enumerable: !1, 365 | value: class { 366 | constructor(e) { 367 | (this.type = context.FLOAT), 368 | (this.normalized = !1), 369 | (this.buffer = context.createBuffer()), 370 | Object.assign(this, e), 371 | this.update(); 372 | } 373 | update() { 374 | void 0 !== this.values && 375 | (context.bindBuffer(this.target, this.buffer), 376 | context.bufferData( 377 | this.target, 378 | this.values, 379 | context.STATIC_DRAW 380 | )); 381 | } 382 | attach(e, t) { 383 | const n = context.getAttribLocation(t, e); 384 | return ( 385 | this.target === context.ARRAY_BUFFER && 386 | (context.enableVertexAttribArray(n), 387 | context.vertexAttribPointer( 388 | n, 389 | this.size, 390 | this.type, 391 | this.normalized, 392 | 0, 393 | 0 394 | )), 395 | n 396 | ); 397 | } 398 | use(e) { 399 | context.bindBuffer(this.target, this.buffer), 400 | this.target === context.ARRAY_BUFFER && 401 | (context.enableVertexAttribArray(e), 402 | context.vertexAttribPointer( 403 | e, 404 | this.size, 405 | this.type, 406 | this.normalized, 407 | 0, 408 | 0 409 | )); 410 | } 411 | }, 412 | }, 413 | }); 414 | const a = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]; 415 | _miniGl.commonUniforms = { 416 | projectionMatrix: new _miniGl.Uniform({ 417 | type: "mat4", 418 | value: a, 419 | }), 420 | modelViewMatrix: new _miniGl.Uniform({ 421 | type: "mat4", 422 | value: a, 423 | }), 424 | resolution: new _miniGl.Uniform({ 425 | type: "vec2", 426 | value: [1, 1], 427 | }), 428 | aspectRatio: new _miniGl.Uniform({ 429 | type: "float", 430 | value: 1, 431 | }), 432 | }; 433 | } 434 | setSize(e = 640, t = 480) { 435 | (this.width = e), 436 | (this.height = t), 437 | (this.canvas.width = e), 438 | (this.canvas.height = t), 439 | this.gl.viewport(0, 0, e, t), 440 | (this.commonUniforms.resolution.value = [e, t]), 441 | (this.commonUniforms.aspectRatio.value = e / t), 442 | this.debug("MiniGL.setSize", { 443 | width: e, 444 | height: t, 445 | }); 446 | } 447 | //left, right, top, bottom, near, far 448 | setOrthographicCamera(e = 0, t = 0, n = 0, i = -2e3, s = 2e3) { 449 | (this.commonUniforms.projectionMatrix.value = [ 450 | 2 / this.width, 451 | 0, 452 | 0, 453 | 0, 454 | 0, 455 | 2 / this.height, 456 | 0, 457 | 0, 458 | 0, 459 | 0, 460 | 2 / (i - s), 461 | 0, 462 | e, 463 | t, 464 | n, 465 | 1, 466 | ]), 467 | this.debug( 468 | "setOrthographicCamera", 469 | this.commonUniforms.projectionMatrix.value 470 | ); 471 | } 472 | render() { 473 | this.gl.clearColor(0, 0, 0, 0), 474 | this.gl.clearDepth(1), 475 | this.meshes.forEach((e) => e.draw()); 476 | } 477 | } 478 | 479 | //Sets initial properties 480 | function e(object, propertyName, val) { 481 | return ( 482 | propertyName in object 483 | ? Object.defineProperty(object, propertyName, { 484 | value: val, 485 | enumerable: !0, 486 | configurable: !0, 487 | writable: !0, 488 | }) 489 | : (object[propertyName] = val), 490 | object 491 | ); 492 | } 493 | 494 | //Gradient object 495 | class Gradient { 496 | constructor(...t) { 497 | e(this, "el", void 0), 498 | e(this, "cssVarRetries", 0), 499 | e(this, "maxCssVarRetries", 200), 500 | e(this, "angle", 0), 501 | e(this, "isLoadedClass", !1), 502 | e(this, "isScrolling", !1), 503 | /*e(this, "isStatic", o.disableAmbientAnimations()),*/ e( 504 | this, 505 | "scrollingTimeout", 506 | void 0 507 | ), 508 | e(this, "scrollingRefreshDelay", 200), 509 | e(this, "isIntersecting", !1), 510 | e(this, "shaderFiles", void 0), 511 | e(this, "vertexShader", void 0), 512 | e(this, "sectionColors", void 0), 513 | e(this, "computedCanvasStyle", void 0), 514 | e(this, "conf", void 0), 515 | e(this, "uniforms", void 0), 516 | e(this, "t", 1253106), 517 | e(this, "last", 0), 518 | e(this, "width", void 0), 519 | e(this, "minWidth", 1111), 520 | e(this, "height", 600), 521 | e(this, "xSegCount", void 0), 522 | e(this, "ySegCount", void 0), 523 | e(this, "mesh", void 0), 524 | e(this, "material", void 0), 525 | e(this, "geometry", void 0), 526 | e(this, "minigl", void 0), 527 | e(this, "scrollObserver", void 0), 528 | e(this, "amp", 320), 529 | e(this, "seed", 5), 530 | e(this, "freqX", 14e-5), 531 | e(this, "freqY", 29e-5), 532 | e(this, "freqDelta", 1e-5), 533 | e(this, "activeColors", [1, 1, 1, 1]), 534 | e(this, "isMetaKey", !1), 535 | e(this, "isGradientLegendVisible", !1), 536 | e(this, "isMouseDown", !1), 537 | e(this, "handleScroll", () => { 538 | clearTimeout(this.scrollingTimeout), 539 | (this.scrollingTimeout = setTimeout( 540 | this.handleScrollEnd, 541 | this.scrollingRefreshDelay 542 | )), 543 | this.isGradientLegendVisible && this.hideGradientLegend(), 544 | this.conf.playing && ((this.isScrolling = !0), this.pause()); 545 | }), 546 | e(this, "handleScrollEnd", () => { 547 | (this.isScrolling = !1), this.isIntersecting && this.play(); 548 | }), 549 | e(this, "resize", () => { 550 | (this.width = window.innerWidth), 551 | this.minigl.setSize(this.width, this.height), 552 | this.minigl.setOrthographicCamera(), 553 | (this.xSegCount = Math.ceil(this.width * this.conf.density[0])), 554 | (this.ySegCount = Math.ceil(this.height * this.conf.density[1])), 555 | this.mesh.geometry.setTopology(this.xSegCount, this.ySegCount), 556 | this.mesh.geometry.setSize(this.width, this.height), 557 | (this.mesh.material.uniforms.u_shadow_power.value = 558 | this.width < 600 ? 5 : 6); 559 | }), 560 | e(this, "handleMouseDown", (e) => { 561 | this.isGradientLegendVisible && 562 | ((this.isMetaKey = e.metaKey), 563 | (this.isMouseDown = !0), 564 | !1 === this.conf.playing && requestAnimationFrame(this.animate)); 565 | }), 566 | e(this, "handleMouseUp", () => { 567 | this.isMouseDown = !1; 568 | }), 569 | e(this, "animate", (e) => { 570 | if (!this.shouldSkipFrame(e) || this.isMouseDown) { 571 | if ( 572 | ((this.t += Math.min(e - this.last, 1e3 / 15)), 573 | (this.last = e), 574 | this.isMouseDown) 575 | ) { 576 | let e = 160; 577 | this.isMetaKey && (e = -160), (this.t += e); 578 | } 579 | (this.mesh.material.uniforms.u_time.value = this.t), 580 | this.minigl.render(); 581 | } 582 | if (0 !== this.last && this.isStatic) 583 | return this.minigl.render(), void this.disconnect(); 584 | /*this.isIntersecting && */ (this.conf.playing || this.isMouseDown) && 585 | requestAnimationFrame(this.animate); 586 | }), 587 | e(this, "addIsLoadedClass", () => { 588 | /*this.isIntersecting && */ !this.isLoadedClass && 589 | ((this.isLoadedClass = !0), 590 | this.el.classList.add("isLoaded"), 591 | setTimeout(() => { 592 | this.el.parentElement.classList.add("isLoaded"); 593 | }, 3e3)); 594 | }), 595 | e(this, "pause", () => { 596 | this.conf.playing = false; 597 | }), 598 | e(this, "play", () => { 599 | requestAnimationFrame(this.animate), (this.conf.playing = true); 600 | }), 601 | e(this, "initGradient", (selector) => { 602 | this.el = document.querySelector(selector); 603 | this.connect(); 604 | return this; 605 | }); 606 | } 607 | async connect() { 608 | (this.shaderFiles = { 609 | vertex: 610 | "varying vec3 v_color;\n\nvoid main() {\n float time = u_time * u_global.noiseSpeed;\n\n vec2 noiseCoord = resolution * uvNorm * u_global.noiseFreq;\n\n vec2 st = 1. - uvNorm.xy;\n\n //\n // Tilting the plane\n //\n\n // Front-to-back tilt\n float tilt = resolution.y / 2.0 * uvNorm.y;\n\n // Left-to-right angle\n float incline = resolution.x * uvNorm.x / 2.0 * u_vertDeform.incline;\n\n // Up-down shift to offset incline\n float offset = resolution.x / 2.0 * u_vertDeform.incline * mix(u_vertDeform.offsetBottom, u_vertDeform.offsetTop, uv.y);\n\n //\n // Vertex noise\n //\n\n float noise = snoise(vec3(\n noiseCoord.x * u_vertDeform.noiseFreq.x + time * u_vertDeform.noiseFlow,\n noiseCoord.y * u_vertDeform.noiseFreq.y,\n time * u_vertDeform.noiseSpeed + u_vertDeform.noiseSeed\n )) * u_vertDeform.noiseAmp;\n\n // Fade noise to zero at edges\n noise *= 1.0 - pow(abs(uvNorm.y), 2.0);\n\n // Clamp to 0\n noise = max(0.0, noise);\n\n vec3 pos = vec3(\n position.x,\n position.y + tilt + incline + noise - offset,\n position.z\n );\n\n //\n // Vertex color, to be passed to fragment shader\n //\n\n if (u_active_colors[0] == 1.) {\n v_color = u_baseColor;\n }\n\n for (int i = 0; i < u_waveLayers_length; i++) {\n if (u_active_colors[i + 1] == 1.) {\n WaveLayers layer = u_waveLayers[i];\n\n float noise = smoothstep(\n layer.noiseFloor,\n layer.noiseCeil,\n snoise(vec3(\n noiseCoord.x * layer.noiseFreq.x + time * layer.noiseFlow,\n noiseCoord.y * layer.noiseFreq.y,\n time * layer.noiseSpeed + layer.noiseSeed\n )) / 2.0 + 0.5\n );\n\n v_color = blendNormal(v_color, layer.color, pow(noise, 4.));\n }\n }\n\n //\n // Finish\n //\n\n gl_Position = projectionMatrix * modelViewMatrix * vec4(pos, 1.0);\n}", 611 | noise: 612 | "//\n// Description : Array and textureless GLSL 2D/3D/4D simplex\n// noise functions.\n// Author : Ian McEwan, Ashima Arts.\n// Maintainer : stegu\n// Lastmod : 20110822 (ijm)\n// License : Copyright (C) 2011 Ashima Arts. All rights reserved.\n// Distributed under the MIT License. See LICENSE file.\n// https://github.com/ashima/webgl-noise\n// https://github.com/stegu/webgl-noise\n//\n\nvec3 mod289(vec3 x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\n\nvec4 mod289(vec4 x) {\n return x - floor(x * (1.0 / 289.0)) * 289.0;\n}\n\nvec4 permute(vec4 x) {\n return mod289(((x*34.0)+1.0)*x);\n}\n\nvec4 taylorInvSqrt(vec4 r)\n{\n return 1.79284291400159 - 0.85373472095314 * r;\n}\n\nfloat snoise(vec3 v)\n{\n const vec2 C = vec2(1.0/6.0, 1.0/3.0) ;\n const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);\n\n// First corner\n vec3 i = floor(v + dot(v, C.yyy) );\n vec3 x0 = v - i + dot(i, C.xxx) ;\n\n// Other corners\n vec3 g = step(x0.yzx, x0.xyz);\n vec3 l = 1.0 - g;\n vec3 i1 = min( g.xyz, l.zxy );\n vec3 i2 = max( g.xyz, l.zxy );\n\n // x0 = x0 - 0.0 + 0.0 * C.xxx;\n // x1 = x0 - i1 + 1.0 * C.xxx;\n // x2 = x0 - i2 + 2.0 * C.xxx;\n // x3 = x0 - 1.0 + 3.0 * C.xxx;\n vec3 x1 = x0 - i1 + C.xxx;\n vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y\n vec3 x3 = x0 - D.yyy; // -1.0+3.0*C.x = -0.5 = -D.y\n\n// Permutations\n i = mod289(i);\n vec4 p = permute( permute( permute(\n i.z + vec4(0.0, i1.z, i2.z, 1.0 ))\n + i.y + vec4(0.0, i1.y, i2.y, 1.0 ))\n + i.x + vec4(0.0, i1.x, i2.x, 1.0 ));\n\n// Gradients: 7x7 points over a square, mapped onto an octahedron.\n// The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294)\n float n_ = 0.142857142857; // 1.0/7.0\n vec3 ns = n_ * D.wyz - D.xzx;\n\n vec4 j = p - 49.0 * floor(p * ns.z * ns.z); // mod(p,7*7)\n\n vec4 x_ = floor(j * ns.z);\n vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N)\n\n vec4 x = x_ *ns.x + ns.yyyy;\n vec4 y = y_ *ns.x + ns.yyyy;\n vec4 h = 1.0 - abs(x) - abs(y);\n\n vec4 b0 = vec4( x.xy, y.xy );\n vec4 b1 = vec4( x.zw, y.zw );\n\n //vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0;\n //vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0;\n vec4 s0 = floor(b0)*2.0 + 1.0;\n vec4 s1 = floor(b1)*2.0 + 1.0;\n vec4 sh = -step(h, vec4(0.0));\n\n vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;\n vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;\n\n vec3 p0 = vec3(a0.xy,h.x);\n vec3 p1 = vec3(a0.zw,h.y);\n vec3 p2 = vec3(a1.xy,h.z);\n vec3 p3 = vec3(a1.zw,h.w);\n\n//Normalise gradients\n vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\n p0 *= norm.x;\n p1 *= norm.y;\n p2 *= norm.z;\n p3 *= norm.w;\n\n// Mix final noise value\n vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);\n m = m * m;\n return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1),\n dot(p2,x2), dot(p3,x3) ) );\n}", 613 | blend: 614 | "//\n// https://github.com/jamieowen/glsl-blend\n//\n\n// Normal\n\nvec3 blendNormal(vec3 base, vec3 blend) {\n\treturn blend;\n}\n\nvec3 blendNormal(vec3 base, vec3 blend, float opacity) {\n\treturn (blendNormal(base, blend) * opacity + base * (1.0 - opacity));\n}\n\n// Screen\n\nfloat blendScreen(float base, float blend) {\n\treturn 1.0-((1.0-base)*(1.0-blend));\n}\n\nvec3 blendScreen(vec3 base, vec3 blend) {\n\treturn vec3(blendScreen(base.r,blend.r),blendScreen(base.g,blend.g),blendScreen(base.b,blend.b));\n}\n\nvec3 blendScreen(vec3 base, vec3 blend, float opacity) {\n\treturn (blendScreen(base, blend) * opacity + base * (1.0 - opacity));\n}\n\n// Multiply\n\nvec3 blendMultiply(vec3 base, vec3 blend) {\n\treturn base*blend;\n}\n\nvec3 blendMultiply(vec3 base, vec3 blend, float opacity) {\n\treturn (blendMultiply(base, blend) * opacity + base * (1.0 - opacity));\n}\n\n// Overlay\n\nfloat blendOverlay(float base, float blend) {\n\treturn base<0.5?(2.0*base*blend):(1.0-2.0*(1.0-base)*(1.0-blend));\n}\n\nvec3 blendOverlay(vec3 base, vec3 blend) {\n\treturn vec3(blendOverlay(base.r,blend.r),blendOverlay(base.g,blend.g),blendOverlay(base.b,blend.b));\n}\n\nvec3 blendOverlay(vec3 base, vec3 blend, float opacity) {\n\treturn (blendOverlay(base, blend) * opacity + base * (1.0 - opacity));\n}\n\n// Hard light\n\nvec3 blendHardLight(vec3 base, vec3 blend) {\n\treturn blendOverlay(blend,base);\n}\n\nvec3 blendHardLight(vec3 base, vec3 blend, float opacity) {\n\treturn (blendHardLight(base, blend) * opacity + base * (1.0 - opacity));\n}\n\n// Soft light\n\nfloat blendSoftLight(float base, float blend) {\n\treturn (blend<0.5)?(2.0*base*blend+base*base*(1.0-2.0*blend)):(sqrt(base)*(2.0*blend-1.0)+2.0*base*(1.0-blend));\n}\n\nvec3 blendSoftLight(vec3 base, vec3 blend) {\n\treturn vec3(blendSoftLight(base.r,blend.r),blendSoftLight(base.g,blend.g),blendSoftLight(base.b,blend.b));\n}\n\nvec3 blendSoftLight(vec3 base, vec3 blend, float opacity) {\n\treturn (blendSoftLight(base, blend) * opacity + base * (1.0 - opacity));\n}\n\n// Color dodge\n\nfloat blendColorDodge(float base, float blend) {\n\treturn (blend==1.0)?blend:min(base/(1.0-blend),1.0);\n}\n\nvec3 blendColorDodge(vec3 base, vec3 blend) {\n\treturn vec3(blendColorDodge(base.r,blend.r),blendColorDodge(base.g,blend.g),blendColorDodge(base.b,blend.b));\n}\n\nvec3 blendColorDodge(vec3 base, vec3 blend, float opacity) {\n\treturn (blendColorDodge(base, blend) * opacity + base * (1.0 - opacity));\n}\n\n// Color burn\n\nfloat blendColorBurn(float base, float blend) {\n\treturn (blend==0.0)?blend:max((1.0-((1.0-base)/blend)),0.0);\n}\n\nvec3 blendColorBurn(vec3 base, vec3 blend) {\n\treturn vec3(blendColorBurn(base.r,blend.r),blendColorBurn(base.g,blend.g),blendColorBurn(base.b,blend.b));\n}\n\nvec3 blendColorBurn(vec3 base, vec3 blend, float opacity) {\n\treturn (blendColorBurn(base, blend) * opacity + base * (1.0 - opacity));\n}\n\n// Vivid Light\n\nfloat blendVividLight(float base, float blend) {\n\treturn (blend<0.5)?blendColorBurn(base,(2.0*blend)):blendColorDodge(base,(2.0*(blend-0.5)));\n}\n\nvec3 blendVividLight(vec3 base, vec3 blend) {\n\treturn vec3(blendVividLight(base.r,blend.r),blendVividLight(base.g,blend.g),blendVividLight(base.b,blend.b));\n}\n\nvec3 blendVividLight(vec3 base, vec3 blend, float opacity) {\n\treturn (blendVividLight(base, blend) * opacity + base * (1.0 - opacity));\n}\n\n// Lighten\n\nfloat blendLighten(float base, float blend) {\n\treturn max(blend,base);\n}\n\nvec3 blendLighten(vec3 base, vec3 blend) {\n\treturn vec3(blendLighten(base.r,blend.r),blendLighten(base.g,blend.g),blendLighten(base.b,blend.b));\n}\n\nvec3 blendLighten(vec3 base, vec3 blend, float opacity) {\n\treturn (blendLighten(base, blend) * opacity + base * (1.0 - opacity));\n}\n\n// Linear burn\n\nfloat blendLinearBurn(float base, float blend) {\n\t// Note : Same implementation as BlendSubtractf\n\treturn max(base+blend-1.0,0.0);\n}\n\nvec3 blendLinearBurn(vec3 base, vec3 blend) {\n\t// Note : Same implementation as BlendSubtract\n\treturn max(base+blend-vec3(1.0),vec3(0.0));\n}\n\nvec3 blendLinearBurn(vec3 base, vec3 blend, float opacity) {\n\treturn (blendLinearBurn(base, blend) * opacity + base * (1.0 - opacity));\n}\n\n// Linear dodge\n\nfloat blendLinearDodge(float base, float blend) {\n\t// Note : Same implementation as BlendAddf\n\treturn min(base+blend,1.0);\n}\n\nvec3 blendLinearDodge(vec3 base, vec3 blend) {\n\t// Note : Same implementation as BlendAdd\n\treturn min(base+blend,vec3(1.0));\n}\n\nvec3 blendLinearDodge(vec3 base, vec3 blend, float opacity) {\n\treturn (blendLinearDodge(base, blend) * opacity + base * (1.0 - opacity));\n}\n\n// Linear light\n\nfloat blendLinearLight(float base, float blend) {\n\treturn blend<0.5?blendLinearBurn(base,(2.0*blend)):blendLinearDodge(base,(2.0*(blend-0.5)));\n}\n\nvec3 blendLinearLight(vec3 base, vec3 blend) {\n\treturn vec3(blendLinearLight(base.r,blend.r),blendLinearLight(base.g,blend.g),blendLinearLight(base.b,blend.b));\n}\n\nvec3 blendLinearLight(vec3 base, vec3 blend, float opacity) {\n\treturn (blendLinearLight(base, blend) * opacity + base * (1.0 - opacity));\n}", 615 | fragment: 616 | "varying vec3 v_color;\n\nvoid main() {\n vec3 color = v_color;\n if (u_darken_top == 1.0) {\n vec2 st = gl_FragCoord.xy/resolution.xy;\n color.g -= pow(st.y + sin(-12.0) * st.x, u_shadow_power) * 0.4;\n }\n gl_FragColor = vec4(color, 1.0);\n}", 617 | }), 618 | (this.conf = { 619 | presetName: "", 620 | wireframe: false, 621 | density: [0.06, 0.16], 622 | zoom: 1, 623 | rotation: 0, 624 | playing: true, 625 | }), 626 | document.querySelectorAll("canvas").length < 1 627 | ? console.log("DID NOT LOAD HERO STRIPE CANVAS") 628 | : ((this.minigl = new MiniGl(this.el, null, null, !0)), 629 | requestAnimationFrame(() => { 630 | this.el && 631 | ((this.computedCanvasStyle = getComputedStyle(this.el)), 632 | this.waitForCssVars()); 633 | })); 634 | /* 635 | this.scrollObserver = await s.create(.1, !1), 636 | this.scrollObserver.observe(this.el), 637 | this.scrollObserver.onSeparate(() => { 638 | window.removeEventListener("scroll", this.handleScroll), window.removeEventListener("mousedown", this.handleMouseDown), window.removeEventListener("mouseup", this.handleMouseUp), window.removeEventListener("keydown", this.handleKeyDown), this.isIntersecting = !1, this.conf.playing && this.pause() 639 | }), 640 | this.scrollObserver.onIntersect(() => { 641 | window.addEventListener("scroll", this.handleScroll), window.addEventListener("mousedown", this.handleMouseDown), window.addEventListener("mouseup", this.handleMouseUp), window.addEventListener("keydown", this.handleKeyDown), this.isIntersecting = !0, this.addIsLoadedClass(), this.play() 642 | })*/ 643 | } 644 | disconnect() { 645 | this.scrollObserver && 646 | (window.removeEventListener("scroll", this.handleScroll), 647 | window.removeEventListener("mousedown", this.handleMouseDown), 648 | window.removeEventListener("mouseup", this.handleMouseUp), 649 | window.removeEventListener("keydown", this.handleKeyDown), 650 | this.scrollObserver.disconnect()), 651 | window.removeEventListener("resize", this.resize); 652 | } 653 | initMaterial() { 654 | this.uniforms = { 655 | u_time: new this.minigl.Uniform({ 656 | value: 0, 657 | }), 658 | u_shadow_power: new this.minigl.Uniform({ 659 | value: 5, 660 | }), 661 | u_darken_top: new this.minigl.Uniform({ 662 | value: "" === this.el.dataset.jsDarkenTop ? 1 : 0, 663 | }), 664 | u_active_colors: new this.minigl.Uniform({ 665 | value: this.activeColors, 666 | type: "vec4", 667 | }), 668 | u_global: new this.minigl.Uniform({ 669 | value: { 670 | noiseFreq: new this.minigl.Uniform({ 671 | value: [this.freqX, this.freqY], 672 | type: "vec2", 673 | }), 674 | noiseSpeed: new this.minigl.Uniform({ 675 | value: 5e-6, 676 | }), 677 | }, 678 | type: "struct", 679 | }), 680 | u_vertDeform: new this.minigl.Uniform({ 681 | value: { 682 | incline: new this.minigl.Uniform({ 683 | value: Math.sin(this.angle) / Math.cos(this.angle), 684 | }), 685 | offsetTop: new this.minigl.Uniform({ 686 | value: -0.5, 687 | }), 688 | offsetBottom: new this.minigl.Uniform({ 689 | value: -0.5, 690 | }), 691 | noiseFreq: new this.minigl.Uniform({ 692 | value: [3, 4], 693 | type: "vec2", 694 | }), 695 | noiseAmp: new this.minigl.Uniform({ 696 | value: this.amp, 697 | }), 698 | noiseSpeed: new this.minigl.Uniform({ 699 | value: 10, 700 | }), 701 | noiseFlow: new this.minigl.Uniform({ 702 | value: 3, 703 | }), 704 | noiseSeed: new this.minigl.Uniform({ 705 | value: this.seed, 706 | }), 707 | }, 708 | type: "struct", 709 | excludeFrom: "fragment", 710 | }), 711 | u_baseColor: new this.minigl.Uniform({ 712 | value: this.sectionColors[0], 713 | type: "vec3", 714 | excludeFrom: "fragment", 715 | }), 716 | u_waveLayers: new this.minigl.Uniform({ 717 | value: [], 718 | excludeFrom: "fragment", 719 | type: "array", 720 | }), 721 | }; 722 | for (let e = 1; e < this.sectionColors.length; e += 1) 723 | this.uniforms.u_waveLayers.value.push( 724 | new this.minigl.Uniform({ 725 | value: { 726 | color: new this.minigl.Uniform({ 727 | value: this.sectionColors[e], 728 | type: "vec3", 729 | }), 730 | noiseFreq: new this.minigl.Uniform({ 731 | value: [ 732 | 2 + e / this.sectionColors.length, 733 | 3 + e / this.sectionColors.length, 734 | ], 735 | type: "vec2", 736 | }), 737 | noiseSpeed: new this.minigl.Uniform({ 738 | value: 11 + 0.3 * e, 739 | }), 740 | noiseFlow: new this.minigl.Uniform({ 741 | value: 6.5 + 0.3 * e, 742 | }), 743 | noiseSeed: new this.minigl.Uniform({ 744 | value: this.seed + 10 * e, 745 | }), 746 | noiseFloor: new this.minigl.Uniform({ 747 | value: 0.1, 748 | }), 749 | noiseCeil: new this.minigl.Uniform({ 750 | value: 0.63 + 0.07 * e, 751 | }), 752 | }, 753 | type: "struct", 754 | }) 755 | ); 756 | return ( 757 | (this.vertexShader = [ 758 | this.shaderFiles.noise, 759 | this.shaderFiles.blend, 760 | this.shaderFiles.vertex, 761 | ].join("\n\n")), 762 | new this.minigl.Material( 763 | this.vertexShader, 764 | this.shaderFiles.fragment, 765 | this.uniforms 766 | ) 767 | ); 768 | } 769 | initMesh() { 770 | (this.material = this.initMaterial()), 771 | (this.geometry = new this.minigl.PlaneGeometry()), 772 | (this.mesh = new this.minigl.Mesh(this.geometry, this.material)); 773 | } 774 | shouldSkipFrame(e) { 775 | return ( 776 | !!window.document.hidden || 777 | !this.conf.playing || 778 | parseInt(e, 10) % 2 == 0 || 779 | void 0 780 | ); 781 | } 782 | updateFrequency(e) { 783 | (this.freqX += e), (this.freqY += e); 784 | } 785 | toggleColor(index) { 786 | this.activeColors[index] = 0 === this.activeColors[index] ? 1 : 0; 787 | } 788 | showGradientLegend() { 789 | this.width > this.minWidth && 790 | ((this.isGradientLegendVisible = !0), 791 | document.body.classList.add("isGradientLegendVisible")); 792 | } 793 | hideGradientLegend() { 794 | (this.isGradientLegendVisible = !1), 795 | document.body.classList.remove("isGradientLegendVisible"); 796 | } 797 | init() { 798 | this.initGradientColors(), 799 | this.initMesh(), 800 | this.resize(), 801 | requestAnimationFrame(this.animate), 802 | window.addEventListener("resize", this.resize); 803 | } 804 | /* 805 | * Waiting for the css variables to become available, usually on page load before we can continue. 806 | * Using default colors assigned below if no variables have been found after maxCssVarRetries 807 | */ 808 | waitForCssVars() { 809 | if ( 810 | this.computedCanvasStyle && 811 | -1 !== 812 | this.computedCanvasStyle 813 | .getPropertyValue("--gradient-color-1") 814 | .indexOf("#") 815 | ) 816 | this.init(), this.addIsLoadedClass(); 817 | else { 818 | if ( 819 | ((this.cssVarRetries += 1), this.cssVarRetries > this.maxCssVarRetries) 820 | ) { 821 | return ( 822 | (this.sectionColors = [16711680, 16711680, 16711935, 65280, 255]), 823 | void this.init() 824 | ); 825 | } 826 | requestAnimationFrame(() => this.waitForCssVars()); 827 | } 828 | } 829 | /* 830 | * Initializes the four section colors by retrieving them from css variables. 831 | */ 832 | initGradientColors() { 833 | this.sectionColors = [ 834 | "--gradient-color-1", 835 | "--gradient-color-2", 836 | "--gradient-color-3", 837 | "--gradient-color-4", 838 | ] 839 | .map((cssPropertyName) => { 840 | let hex = this.computedCanvasStyle 841 | .getPropertyValue(cssPropertyName) 842 | .trim(); 843 | //Check if shorthand hex value was used and double the length so the conversion in normalizeColor will work. 844 | if (4 === hex.length) { 845 | const hexTemp = hex 846 | .substr(1) 847 | .split("") 848 | .map((hexTemp) => hexTemp + hexTemp) 849 | .join(""); 850 | hex = `#${hexTemp}`; 851 | } 852 | return hex && `0x${hex.substr(1)}`; 853 | }) 854 | .filter(Boolean) 855 | .map(normalizeColor); 856 | } 857 | } 858 | 859 | /* 860 | *Finally initializing the Gradient class, assigning a canvas to it and calling Gradient.connect() which initializes everything, 861 | * Use Gradient.pause() and Gradient.play() for controls. 862 | * 863 | * Here are some default property values you can change anytime: 864 | * Amplitude: Gradient.amp = 0 865 | * Colors: Gradient.sectionColors (if you change colors, use normalizeColor(#hexValue)) before you assign it. 866 | * 867 | * 868 | * Useful functions 869 | * Gradient.toggleColor(index) 870 | * Gradient.updateFrequency(freq) 871 | */ 872 | // var gradient = new Gradient(); 873 | // gradient.initGradient("#gradient-canvas"); 874 | 875 | export { Gradient }; 876 | -------------------------------------------------------------------------------- /src/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | declare module '*.vue' { 4 | import { DefineComponent } from 'vue' 5 | // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types 6 | const component: DefineComponent<{}, {}, any> 7 | export default component 8 | } 9 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import App from './App.vue' 3 | 4 | createApp(App).mount('#app') 5 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowJs": true, 4 | "target": "esnext", 5 | "useDefineForClassFields": true, 6 | "module": "esnext", 7 | "moduleResolution": "node", 8 | "strict": true, 9 | "jsx": "preserve", 10 | "sourceMap": true, 11 | "resolveJsonModule": true, 12 | "esModuleInterop": true, 13 | "lib": ["esnext", "dom"] 14 | }, 15 | "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"] 16 | } 17 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import vue from '@vitejs/plugin-vue' 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | plugins: [vue()] 7 | }) 8 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/helper-validator-identifier@^7.14.9": 6 | version "7.14.9" 7 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48" 8 | integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g== 9 | 10 | "@babel/parser@^7.15.0", "@babel/parser@^7.6.0", "@babel/parser@^7.9.6": 11 | version "7.15.6" 12 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.6.tgz#043b9aa3c303c0722e5377fef9197f4cf1796549" 13 | integrity sha512-S/TSCcsRuCkmpUuoWijua0Snt+f3ewU/8spLo+4AXJCZfT0bVCzLD5MuOKdrx0mlAptbKzn5AdgEIIKXxXkz9Q== 14 | 15 | "@babel/types@^7.15.0", "@babel/types@^7.6.1", "@babel/types@^7.9.6": 16 | version "7.15.6" 17 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.6.tgz#99abdc48218b2881c058dd0a7ab05b99c9be758f" 18 | integrity sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig== 19 | dependencies: 20 | "@babel/helper-validator-identifier" "^7.14.9" 21 | to-fast-properties "^2.0.0" 22 | 23 | "@emmetio/abbreviation@^2.2.2": 24 | version "2.2.2" 25 | resolved "https://registry.yarnpkg.com/@emmetio/abbreviation/-/abbreviation-2.2.2.tgz#746762fd9e7a8c2ea604f580c62e3cfe250e6989" 26 | integrity sha512-TtE/dBnkTCct8+LntkqVrwqQao6EnPAs1YN3cUgxOxTaBlesBCY37ROUAVZrRlG64GNnVShdl/b70RfAI3w5lw== 27 | dependencies: 28 | "@emmetio/scanner" "^1.0.0" 29 | 30 | "@emmetio/css-abbreviation@^2.1.4": 31 | version "2.1.4" 32 | resolved "https://registry.yarnpkg.com/@emmetio/css-abbreviation/-/css-abbreviation-2.1.4.tgz#90362e8a1122ce3b76f6c3157907d30182f53f54" 33 | integrity sha512-qk9L60Y+uRtM5CPbB0y+QNl/1XKE09mSO+AhhSauIfr2YOx/ta3NJw2d8RtCFxgzHeRqFRr8jgyzThbu+MZ4Uw== 34 | dependencies: 35 | "@emmetio/scanner" "^1.0.0" 36 | 37 | "@emmetio/scanner@^1.0.0": 38 | version "1.0.0" 39 | resolved "https://registry.yarnpkg.com/@emmetio/scanner/-/scanner-1.0.0.tgz#065b2af6233fe7474d44823e3deb89724af42b5f" 40 | integrity sha512-8HqW8EVqjnCmWXVpqAOZf+EGESdkR27odcMMMGefgKXtar00SoYNSryGv//TELI4T3QFsECo78p+0lmalk/CFA== 41 | 42 | "@types/estree@^0.0.48": 43 | version "0.0.48" 44 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.48.tgz#18dc8091b285df90db2f25aa7d906cfc394b7f74" 45 | integrity sha512-LfZwXoGUDo0C3me81HXgkBg5CTQYb6xzEl+fNmbO4JdRiSKQ8A0GD1OBBvKAIsbCUgoyAty7m99GqqMQe784ew== 46 | 47 | "@vitejs/plugin-vue@^1.6.1": 48 | version "1.6.2" 49 | resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-1.6.2.tgz#40dfe314cff610d4dd027a0b4ea2a93a257f3fc9" 50 | integrity sha512-Pf+dqkT4pWPfziPm51VtDXsPwE74CEGRiK6Vgm5EDBewHw1EgcxG7V2ZI/Yqj5gcDy5nVtjgx0AbsTL+F3gddg== 51 | 52 | "@volar/code-gen@^0.27.14": 53 | version "0.27.14" 54 | resolved "https://registry.yarnpkg.com/@volar/code-gen/-/code-gen-0.27.14.tgz#fea4bde0c05b81f22e16185e01ecb6fedd842e05" 55 | integrity sha512-RVu9CNuaiJxBWKU8J7xJogrSlEjOnJS/hVP0zhSYRcOXmnpb0EI/zf111bV2Ng9fj7kP/MQCmCVRikIAJf/wAw== 56 | dependencies: 57 | "@volar/shared" "^0.27.14" 58 | "@volar/source-map" "^0.27.14" 59 | 60 | "@volar/html2pug@^0.27.13": 61 | version "0.27.13" 62 | resolved "https://registry.yarnpkg.com/@volar/html2pug/-/html2pug-0.27.13.tgz#48dfa73ecf1ef1955a02a046d0c88845950fac85" 63 | integrity sha512-3NYgNA5F3PDsKbbpOrVdGy2S7ZYmZIbFmbp1A/27DDzjj/uIC9Pj7HXVvbYOzi8HcOxUPt0BMrh4TVzBUaCFww== 64 | dependencies: 65 | domelementtype "^2.2.0" 66 | domhandler "^4.2.0" 67 | htmlparser2 "^6.1.0" 68 | pug "^3.0.2" 69 | 70 | "@volar/shared@^0.27.14": 71 | version "0.27.14" 72 | resolved "https://registry.yarnpkg.com/@volar/shared/-/shared-0.27.14.tgz#d98f2b0b890e315cc20b4edb5e1ffbe8aad2297a" 73 | integrity sha512-yIz0ak2oQ3w1wWmMq2nuDlAjoW51tqNTJl8xMrhI04to/ebg8fnq8Y4jvvSjTZrFm4I4a4E0PfyTTXf3gdX8Zg== 74 | dependencies: 75 | upath "^2.0.1" 76 | vscode-jsonrpc "^8.0.0-next.2" 77 | vscode-uri "^3.0.2" 78 | 79 | "@volar/source-map@^0.27.14": 80 | version "0.27.14" 81 | resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-0.27.14.tgz#0b5656f74b5a85887efec97ea112caad9cc52a97" 82 | integrity sha512-NNNj6ltDRhHN7AYvka3JbJyeNUpAbIUitvaElTIYph6XM+JRYFDpDu72dmJ0ZlIQ7MwcvcxRkwGpli9udiqtig== 83 | dependencies: 84 | "@volar/shared" "^0.27.14" 85 | 86 | "@volar/transforms@^0.27.14": 87 | version "0.27.14" 88 | resolved "https://registry.yarnpkg.com/@volar/transforms/-/transforms-0.27.14.tgz#b796ddb844b6f9f5301f5941092f9ed95a2db12d" 89 | integrity sha512-sKUGlfIwtG/ZHy/cUs03O+enXgwFPsec00XvbxTH0+Bje3NMFUmzT2s+Uvyq88bxH2HDcGB2kkXiPz5MpUJqfg== 90 | dependencies: 91 | "@volar/shared" "^0.27.14" 92 | vscode-languageserver "^8.0.0-next.2" 93 | 94 | "@vscode/emmet-helper@^2.7.0": 95 | version "2.7.0" 96 | resolved "https://registry.yarnpkg.com/@vscode/emmet-helper/-/emmet-helper-2.7.0.tgz#3db485f6a650196ff8bbd38ba1b9e468ec8d22f8" 97 | integrity sha512-LL7MoKNLUQASacQROO7hBdx5IAxsEnA0UdJFd9xXyf3sBQgz8NE3QEfo3IezE7uin8W2fkG2+EXMst3oqK6+KQ== 98 | dependencies: 99 | emmet "^2.3.0" 100 | jsonc-parser "^2.3.0" 101 | vscode-languageserver-textdocument "^1.0.1" 102 | vscode-languageserver-types "^3.15.1" 103 | vscode-nls "^5.0.0" 104 | vscode-uri "^2.1.2" 105 | 106 | "@vue/compiler-core@3.2.11": 107 | version "3.2.11" 108 | resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.11.tgz#10af3777dba303ee7aae668029f131cb90391bee" 109 | integrity sha512-bcbsLx5XyQg8WDDEGwmpX0BfEfv82wIs9fWFelpyVhNRGMaABvUTalYINyfhVT+jOqNaD4JBhJiVKd/8TmsHWg== 110 | dependencies: 111 | "@babel/parser" "^7.15.0" 112 | "@babel/types" "^7.15.0" 113 | "@vue/shared" "3.2.11" 114 | estree-walker "^2.0.2" 115 | source-map "^0.6.1" 116 | 117 | "@vue/compiler-dom@3.2.11", "@vue/compiler-dom@^3.2.6": 118 | version "3.2.11" 119 | resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.11.tgz#d066f8e1f1812b4e881593819ade0fe6d654c776" 120 | integrity sha512-DNvhUHI/1Hn0/+ZYDYGAuDGasUm+XHKC3FE4GqkNCTO/fcLaJMRg/7eT1m1lkc7jPffUwwfh1rZru5mwzOjrNw== 121 | dependencies: 122 | "@vue/compiler-core" "3.2.11" 123 | "@vue/shared" "3.2.11" 124 | 125 | "@vue/compiler-sfc@^3.2.6": 126 | version "3.2.11" 127 | resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.11.tgz#628fa12238760d9b9b339ac2e125a759224fadbf" 128 | integrity sha512-cUIaS8mgJrQ6yucj2AupWAwBRITK3W/a8wCOn9g5fJGtOl8h4APY8vN3lzP8HIJDyEeRF3I8SfRhL+oX97kSnw== 129 | dependencies: 130 | "@babel/parser" "^7.15.0" 131 | "@babel/types" "^7.15.0" 132 | "@types/estree" "^0.0.48" 133 | "@vue/compiler-core" "3.2.11" 134 | "@vue/compiler-dom" "3.2.11" 135 | "@vue/compiler-ssr" "3.2.11" 136 | "@vue/ref-transform" "3.2.11" 137 | "@vue/shared" "3.2.11" 138 | consolidate "^0.16.0" 139 | estree-walker "^2.0.2" 140 | hash-sum "^2.0.0" 141 | lru-cache "^5.1.1" 142 | magic-string "^0.25.7" 143 | merge-source-map "^1.1.0" 144 | postcss "^8.1.10" 145 | postcss-modules "^4.0.0" 146 | postcss-selector-parser "^6.0.4" 147 | source-map "^0.6.1" 148 | 149 | "@vue/compiler-ssr@3.2.11": 150 | version "3.2.11" 151 | resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.11.tgz#702cef3429651645bdbe09fe5962803b5a621abb" 152 | integrity sha512-+ptAdUlFDij+Z0VGCbRRkxQlNev5LkbZAntvkxrFjc08CTMhZmiV4Js48n2hAmuSXaKNEpmGkDGU26c/vf1+xw== 153 | dependencies: 154 | "@vue/compiler-dom" "3.2.11" 155 | "@vue/shared" "3.2.11" 156 | 157 | "@vue/reactivity@3.2.11", "@vue/reactivity@^3.2.6": 158 | version "3.2.11" 159 | resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.11.tgz#ec04d33acaf2b92cca2960535bec81b26cc5772b" 160 | integrity sha512-hEQstxPQbgGZq5qApzrvbDmRdK1KP96O/j4XrwT8fVkT1ytkFs4fH2xNEh9QKwXfybbQkLs77W7OfXCv5o6qbA== 161 | dependencies: 162 | "@vue/shared" "3.2.11" 163 | 164 | "@vue/ref-transform@3.2.11": 165 | version "3.2.11" 166 | resolved "https://registry.yarnpkg.com/@vue/ref-transform/-/ref-transform-3.2.11.tgz#4d282b9570d1485a73e7bf5d57cce27b4a7aa690" 167 | integrity sha512-7rX0YsfYb7+1PeKPME1tQyUQcQgt0sIXRRnPD1Vw8Zs2KIo90YLy9CrvwalcRCxGw0ScsjBEhVjJtWIT79TElg== 168 | dependencies: 169 | "@babel/parser" "^7.15.0" 170 | "@vue/compiler-core" "3.2.11" 171 | "@vue/shared" "3.2.11" 172 | estree-walker "^2.0.2" 173 | magic-string "^0.25.7" 174 | 175 | "@vue/runtime-core@3.2.11": 176 | version "3.2.11" 177 | resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.11.tgz#0dbe801be4bd0bfde253226797e7d304c8fdda30" 178 | integrity sha512-horlxjWwSvModC87WdsWswzzHE5IexmKkQA65S5vFgP5hLUBW+HRyScDeuB/RRcFmqnf+ozacNCfap0kqcpODw== 179 | dependencies: 180 | "@vue/reactivity" "3.2.11" 181 | "@vue/shared" "3.2.11" 182 | 183 | "@vue/runtime-dom@3.2.11": 184 | version "3.2.11" 185 | resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.11.tgz#04f9054a9e64bdf156c2fc22cad67cfaa8b84616" 186 | integrity sha512-cOK1g0INdiCbds2xrrJKrrN+pDHuLz6esUs/crdEiupDuX7IeiMbdqrAQCkYHp5P1KLWcbGlkmwfVD7HQGii0Q== 187 | dependencies: 188 | "@vue/runtime-core" "3.2.11" 189 | "@vue/shared" "3.2.11" 190 | csstype "^2.6.8" 191 | 192 | "@vue/shared@3.2.11", "@vue/shared@^3.2.6": 193 | version "3.2.11" 194 | resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.11.tgz#01899f54949caf1ac241de397bd17069632574de" 195 | integrity sha512-ovfXAsSsCvV9JVceWjkqC/7OF5HbgLOtCWjCIosmPGG8lxbPuavhIxRH1dTx4Dg9xLgRTNLvI3pVxG4ItQZekg== 196 | 197 | acorn@^7.1.1: 198 | version "7.4.1" 199 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" 200 | integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== 201 | 202 | anymatch@~3.1.2: 203 | version "3.1.2" 204 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" 205 | integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== 206 | dependencies: 207 | normalize-path "^3.0.0" 208 | picomatch "^2.0.4" 209 | 210 | asap@~2.0.3: 211 | version "2.0.6" 212 | resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" 213 | integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= 214 | 215 | assert-never@^1.2.1: 216 | version "1.2.1" 217 | resolved "https://registry.yarnpkg.com/assert-never/-/assert-never-1.2.1.tgz#11f0e363bf146205fb08193b5c7b90f4d1cf44fe" 218 | integrity sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw== 219 | 220 | babel-walk@3.0.0-canary-5: 221 | version "3.0.0-canary-5" 222 | resolved "https://registry.yarnpkg.com/babel-walk/-/babel-walk-3.0.0-canary-5.tgz#f66ecd7298357aee44955f235a6ef54219104b11" 223 | integrity sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw== 224 | dependencies: 225 | "@babel/types" "^7.9.6" 226 | 227 | big.js@^5.2.2: 228 | version "5.2.2" 229 | resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" 230 | integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== 231 | 232 | binary-extensions@^2.0.0: 233 | version "2.2.0" 234 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 235 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 236 | 237 | bluebird@^3.7.2: 238 | version "3.7.2" 239 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" 240 | integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== 241 | 242 | braces@~3.0.2: 243 | version "3.0.2" 244 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 245 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 246 | dependencies: 247 | fill-range "^7.0.1" 248 | 249 | call-bind@^1.0.2: 250 | version "1.0.2" 251 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" 252 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 253 | dependencies: 254 | function-bind "^1.1.1" 255 | get-intrinsic "^1.0.2" 256 | 257 | character-parser@^2.2.0: 258 | version "2.2.0" 259 | resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0" 260 | integrity sha1-x84o821LzZdE5f/CxfzeHHMmH8A= 261 | dependencies: 262 | is-regex "^1.0.3" 263 | 264 | "chokidar@>=3.0.0 <4.0.0": 265 | version "3.5.2" 266 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" 267 | integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== 268 | dependencies: 269 | anymatch "~3.1.2" 270 | braces "~3.0.2" 271 | glob-parent "~5.1.2" 272 | is-binary-path "~2.1.0" 273 | is-glob "~4.0.1" 274 | normalize-path "~3.0.0" 275 | readdirp "~3.6.0" 276 | optionalDependencies: 277 | fsevents "~2.3.2" 278 | 279 | clipboard@^2.0.6: 280 | version "2.0.8" 281 | resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.8.tgz#ffc6c103dd2967a83005f3f61976aa4655a4cdba" 282 | integrity sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ== 283 | dependencies: 284 | good-listener "^1.2.2" 285 | select "^1.1.2" 286 | tiny-emitter "^2.0.0" 287 | 288 | color-schemes-generator@^1.0.1: 289 | version "1.0.1" 290 | resolved "https://registry.yarnpkg.com/color-schemes-generator/-/color-schemes-generator-1.0.1.tgz#10823c9605bb4ce1687666617844a4a091d8b9f2" 291 | integrity sha512-pmXbEO84zprScjQR2C2wJ980VX0uk2FjUYvjOox91YnX5xgzeNvnCEhANgC7q3RLQE8GnKdJTAzpmbkJsa3LRg== 292 | 293 | colorette@^1.2.2: 294 | version "1.4.0" 295 | resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" 296 | integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== 297 | 298 | consolidate@^0.16.0: 299 | version "0.16.0" 300 | resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.16.0.tgz#a11864768930f2f19431660a65906668f5fbdc16" 301 | integrity sha512-Nhl1wzCslqXYTJVDyJCu3ODohy9OfBMB5uD2BiBTzd7w+QY0lBzafkR8y8755yMYHAaMD4NuzbAw03/xzfw+eQ== 302 | dependencies: 303 | bluebird "^3.7.2" 304 | 305 | constantinople@^4.0.1: 306 | version "4.0.1" 307 | resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-4.0.1.tgz#0def113fa0e4dc8de83331a5cf79c8b325213151" 308 | integrity sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw== 309 | dependencies: 310 | "@babel/parser" "^7.6.0" 311 | "@babel/types" "^7.6.1" 312 | 313 | cssesc@^3.0.0: 314 | version "3.0.0" 315 | resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" 316 | integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== 317 | 318 | csstype@^2.6.8: 319 | version "2.6.17" 320 | resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.17.tgz#4cf30eb87e1d1a005d8b6510f95292413f6a1c0e" 321 | integrity sha512-u1wmTI1jJGzCJzWndZo8mk4wnPTZd1eOIYTYvuEyOQGfmDl3TrabCCfKnOC86FZwW/9djqTl933UF/cS425i9A== 322 | 323 | delegate@^3.1.2: 324 | version "3.2.0" 325 | resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" 326 | integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== 327 | 328 | doctypes@^1.1.0: 329 | version "1.1.0" 330 | resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9" 331 | integrity sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk= 332 | 333 | dom-serializer@^1.0.1: 334 | version "1.3.2" 335 | resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" 336 | integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== 337 | dependencies: 338 | domelementtype "^2.0.1" 339 | domhandler "^4.2.0" 340 | entities "^2.0.0" 341 | 342 | domelementtype@^2.0.1, domelementtype@^2.2.0: 343 | version "2.2.0" 344 | resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" 345 | integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== 346 | 347 | domhandler@^4.0.0, domhandler@^4.2.0: 348 | version "4.2.2" 349 | resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.2.tgz#e825d721d19a86b8c201a35264e226c678ee755f" 350 | integrity sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w== 351 | dependencies: 352 | domelementtype "^2.2.0" 353 | 354 | domutils@^2.5.2: 355 | version "2.8.0" 356 | resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" 357 | integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== 358 | dependencies: 359 | dom-serializer "^1.0.1" 360 | domelementtype "^2.2.0" 361 | domhandler "^4.2.0" 362 | 363 | emmet@^2.3.0: 364 | version "2.3.4" 365 | resolved "https://registry.yarnpkg.com/emmet/-/emmet-2.3.4.tgz#5ba0d7a5569a68c7697dfa890c772e4f3179d123" 366 | integrity sha512-3IqSwmO+N2ZGeuhDyhV/TIOJFUbkChi53bcasSNRE7Yd+4eorbbYz4e53TpMECt38NtYkZNupQCZRlwdAYA42A== 367 | dependencies: 368 | "@emmetio/abbreviation" "^2.2.2" 369 | "@emmetio/css-abbreviation" "^2.1.4" 370 | 371 | emojis-list@^3.0.0: 372 | version "3.0.0" 373 | resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" 374 | integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== 375 | 376 | entities@^2.0.0: 377 | version "2.2.0" 378 | resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" 379 | integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== 380 | 381 | esbuild@^0.12.17: 382 | version "0.12.26" 383 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.12.26.tgz#35f2d58ac3fa4629df24aa4d6fd72feb5522e94b" 384 | integrity sha512-YmTkhPKjvTJ+G5e96NyhGf69bP+hzO0DscqaVJTi5GM34uaD4Ecj7omu5lJO+NrxCUBRhy2chONLK1h/2LwoXA== 385 | 386 | estree-walker@^2.0.2: 387 | version "2.0.2" 388 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" 389 | integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== 390 | 391 | fill-range@^7.0.1: 392 | version "7.0.1" 393 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 394 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 395 | dependencies: 396 | to-regex-range "^5.0.1" 397 | 398 | fsevents@~2.3.2: 399 | version "2.3.2" 400 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 401 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 402 | 403 | function-bind@^1.1.1: 404 | version "1.1.1" 405 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 406 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 407 | 408 | generic-names@^2.0.1: 409 | version "2.0.1" 410 | resolved "https://registry.yarnpkg.com/generic-names/-/generic-names-2.0.1.tgz#f8a378ead2ccaa7a34f0317b05554832ae41b872" 411 | integrity sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ== 412 | dependencies: 413 | loader-utils "^1.1.0" 414 | 415 | get-intrinsic@^1.0.2: 416 | version "1.1.1" 417 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" 418 | integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== 419 | dependencies: 420 | function-bind "^1.1.1" 421 | has "^1.0.3" 422 | has-symbols "^1.0.1" 423 | 424 | glob-parent@~5.1.2: 425 | version "5.1.2" 426 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 427 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 428 | dependencies: 429 | is-glob "^4.0.1" 430 | 431 | good-listener@^1.2.2: 432 | version "1.2.2" 433 | resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" 434 | integrity sha1-1TswzfkxPf+33JoNR3CWqm0UXFA= 435 | dependencies: 436 | delegate "^3.1.2" 437 | 438 | has-symbols@^1.0.1, has-symbols@^1.0.2: 439 | version "1.0.2" 440 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" 441 | integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== 442 | 443 | has-tostringtag@^1.0.0: 444 | version "1.0.0" 445 | resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" 446 | integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== 447 | dependencies: 448 | has-symbols "^1.0.2" 449 | 450 | has@^1.0.3: 451 | version "1.0.3" 452 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 453 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 454 | dependencies: 455 | function-bind "^1.1.1" 456 | 457 | hash-sum@^2.0.0: 458 | version "2.0.0" 459 | resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-2.0.0.tgz#81d01bb5de8ea4a214ad5d6ead1b523460b0b45a" 460 | integrity sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg== 461 | 462 | htmlparser2@^6.1.0: 463 | version "6.1.0" 464 | resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" 465 | integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== 466 | dependencies: 467 | domelementtype "^2.0.1" 468 | domhandler "^4.0.0" 469 | domutils "^2.5.2" 470 | entities "^2.0.0" 471 | 472 | icss-replace-symbols@^1.1.0: 473 | version "1.1.0" 474 | resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" 475 | integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= 476 | 477 | icss-utils@^5.0.0: 478 | version "5.1.0" 479 | resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" 480 | integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== 481 | 482 | is-binary-path@~2.1.0: 483 | version "2.1.0" 484 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 485 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 486 | dependencies: 487 | binary-extensions "^2.0.0" 488 | 489 | is-core-module@^2.2.0: 490 | version "2.6.0" 491 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.6.0.tgz#d7553b2526fe59b92ba3e40c8df757ec8a709e19" 492 | integrity sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ== 493 | dependencies: 494 | has "^1.0.3" 495 | 496 | is-expression@^4.0.0: 497 | version "4.0.0" 498 | resolved "https://registry.yarnpkg.com/is-expression/-/is-expression-4.0.0.tgz#c33155962abf21d0afd2552514d67d2ec16fd2ab" 499 | integrity sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A== 500 | dependencies: 501 | acorn "^7.1.1" 502 | object-assign "^4.1.1" 503 | 504 | is-extglob@^2.1.1: 505 | version "2.1.1" 506 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 507 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 508 | 509 | is-glob@^4.0.1, is-glob@~4.0.1: 510 | version "4.0.1" 511 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 512 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 513 | dependencies: 514 | is-extglob "^2.1.1" 515 | 516 | is-number@^7.0.0: 517 | version "7.0.0" 518 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 519 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 520 | 521 | is-promise@^2.0.0: 522 | version "2.2.2" 523 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" 524 | integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== 525 | 526 | is-regex@^1.0.3: 527 | version "1.1.4" 528 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" 529 | integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== 530 | dependencies: 531 | call-bind "^1.0.2" 532 | has-tostringtag "^1.0.0" 533 | 534 | js-stringify@^1.0.2: 535 | version "1.0.2" 536 | resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db" 537 | integrity sha1-Fzb939lyTyijaCrcYjCufk6Weds= 538 | 539 | json5@^1.0.1: 540 | version "1.0.1" 541 | resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" 542 | integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== 543 | dependencies: 544 | minimist "^1.2.0" 545 | 546 | jsonc-parser@^2.3.0: 547 | version "2.3.1" 548 | resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-2.3.1.tgz#59549150b133f2efacca48fe9ce1ec0659af2342" 549 | integrity sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg== 550 | 551 | jsonc-parser@^3.0.0: 552 | version "3.0.0" 553 | resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22" 554 | integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA== 555 | 556 | jstransformer@1.0.0: 557 | version "1.0.0" 558 | resolved "https://registry.yarnpkg.com/jstransformer/-/jstransformer-1.0.0.tgz#ed8bf0921e2f3f1ed4d5c1a44f68709ed24722c3" 559 | integrity sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM= 560 | dependencies: 561 | is-promise "^2.0.0" 562 | promise "^7.0.1" 563 | 564 | loader-utils@^1.1.0: 565 | version "1.4.0" 566 | resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" 567 | integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== 568 | dependencies: 569 | big.js "^5.2.2" 570 | emojis-list "^3.0.0" 571 | json5 "^1.0.1" 572 | 573 | lodash.camelcase@^4.3.0: 574 | version "4.3.0" 575 | resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" 576 | integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= 577 | 578 | lru-cache@^5.1.1: 579 | version "5.1.1" 580 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" 581 | integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== 582 | dependencies: 583 | yallist "^3.0.2" 584 | 585 | lru-cache@^6.0.0: 586 | version "6.0.0" 587 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 588 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 589 | dependencies: 590 | yallist "^4.0.0" 591 | 592 | magic-string@^0.25.7: 593 | version "0.25.7" 594 | resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" 595 | integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== 596 | dependencies: 597 | sourcemap-codec "^1.4.4" 598 | 599 | merge-source-map@^1.1.0: 600 | version "1.1.0" 601 | resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" 602 | integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== 603 | dependencies: 604 | source-map "^0.6.1" 605 | 606 | minimist@^1.2.0: 607 | version "1.2.5" 608 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 609 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 610 | 611 | nanoid@^3.1.23: 612 | version "3.1.25" 613 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.25.tgz#09ca32747c0e543f0e1814b7d3793477f9c8e152" 614 | integrity sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q== 615 | 616 | normalize-path@^3.0.0, normalize-path@~3.0.0: 617 | version "3.0.0" 618 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 619 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 620 | 621 | object-assign@^4.1.1: 622 | version "4.1.1" 623 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 624 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 625 | 626 | path-parse@^1.0.6: 627 | version "1.0.7" 628 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 629 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 630 | 631 | picomatch@^2.0.4, picomatch@^2.2.1: 632 | version "2.3.0" 633 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" 634 | integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== 635 | 636 | postcss-modules-extract-imports@^3.0.0: 637 | version "3.0.0" 638 | resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" 639 | integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== 640 | 641 | postcss-modules-local-by-default@^4.0.0: 642 | version "4.0.0" 643 | resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" 644 | integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== 645 | dependencies: 646 | icss-utils "^5.0.0" 647 | postcss-selector-parser "^6.0.2" 648 | postcss-value-parser "^4.1.0" 649 | 650 | postcss-modules-scope@^3.0.0: 651 | version "3.0.0" 652 | resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" 653 | integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== 654 | dependencies: 655 | postcss-selector-parser "^6.0.4" 656 | 657 | postcss-modules-values@^4.0.0: 658 | version "4.0.0" 659 | resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" 660 | integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== 661 | dependencies: 662 | icss-utils "^5.0.0" 663 | 664 | postcss-modules@^4.0.0: 665 | version "4.2.2" 666 | resolved "https://registry.yarnpkg.com/postcss-modules/-/postcss-modules-4.2.2.tgz#5e7777c5a8964ea176919d90b2e54ef891321ce5" 667 | integrity sha512-/H08MGEmaalv/OU8j6bUKi/kZr2kqGF6huAW8m9UAgOLWtpFdhA14+gPBoymtqyv+D4MLsmqaF2zvIegdCxJXg== 668 | dependencies: 669 | generic-names "^2.0.1" 670 | icss-replace-symbols "^1.1.0" 671 | lodash.camelcase "^4.3.0" 672 | postcss-modules-extract-imports "^3.0.0" 673 | postcss-modules-local-by-default "^4.0.0" 674 | postcss-modules-scope "^3.0.0" 675 | postcss-modules-values "^4.0.0" 676 | string-hash "^1.1.1" 677 | 678 | postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: 679 | version "6.0.6" 680 | resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea" 681 | integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg== 682 | dependencies: 683 | cssesc "^3.0.0" 684 | util-deprecate "^1.0.2" 685 | 686 | postcss-value-parser@^4.1.0: 687 | version "4.1.0" 688 | resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" 689 | integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== 690 | 691 | postcss@^8.1.10, postcss@^8.3.6: 692 | version "8.3.6" 693 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.6.tgz#2730dd76a97969f37f53b9a6096197be311cc4ea" 694 | integrity sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A== 695 | dependencies: 696 | colorette "^1.2.2" 697 | nanoid "^3.1.23" 698 | source-map-js "^0.6.2" 699 | 700 | promise@^7.0.1: 701 | version "7.3.1" 702 | resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" 703 | integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== 704 | dependencies: 705 | asap "~2.0.3" 706 | 707 | pug-attrs@^3.0.0: 708 | version "3.0.0" 709 | resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-3.0.0.tgz#b10451e0348165e31fad1cc23ebddd9dc7347c41" 710 | integrity sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA== 711 | dependencies: 712 | constantinople "^4.0.1" 713 | js-stringify "^1.0.2" 714 | pug-runtime "^3.0.0" 715 | 716 | pug-code-gen@^3.0.2: 717 | version "3.0.2" 718 | resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-3.0.2.tgz#ad190f4943133bf186b60b80de483100e132e2ce" 719 | integrity sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg== 720 | dependencies: 721 | constantinople "^4.0.1" 722 | doctypes "^1.1.0" 723 | js-stringify "^1.0.2" 724 | pug-attrs "^3.0.0" 725 | pug-error "^2.0.0" 726 | pug-runtime "^3.0.0" 727 | void-elements "^3.1.0" 728 | with "^7.0.0" 729 | 730 | pug-error@^2.0.0: 731 | version "2.0.0" 732 | resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-2.0.0.tgz#5c62173cb09c34de2a2ce04f17b8adfec74d8ca5" 733 | integrity sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ== 734 | 735 | pug-filters@^4.0.0: 736 | version "4.0.0" 737 | resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-4.0.0.tgz#d3e49af5ba8472e9b7a66d980e707ce9d2cc9b5e" 738 | integrity sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A== 739 | dependencies: 740 | constantinople "^4.0.1" 741 | jstransformer "1.0.0" 742 | pug-error "^2.0.0" 743 | pug-walk "^2.0.0" 744 | resolve "^1.15.1" 745 | 746 | pug-lexer@^5.0.1: 747 | version "5.0.1" 748 | resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-5.0.1.tgz#ae44628c5bef9b190b665683b288ca9024b8b0d5" 749 | integrity sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w== 750 | dependencies: 751 | character-parser "^2.2.0" 752 | is-expression "^4.0.0" 753 | pug-error "^2.0.0" 754 | 755 | pug-linker@^4.0.0: 756 | version "4.0.0" 757 | resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-4.0.0.tgz#12cbc0594fc5a3e06b9fc59e6f93c146962a7708" 758 | integrity sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw== 759 | dependencies: 760 | pug-error "^2.0.0" 761 | pug-walk "^2.0.0" 762 | 763 | pug-load@^3.0.0: 764 | version "3.0.0" 765 | resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-3.0.0.tgz#9fd9cda52202b08adb11d25681fb9f34bd41b662" 766 | integrity sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ== 767 | dependencies: 768 | object-assign "^4.1.1" 769 | pug-walk "^2.0.0" 770 | 771 | pug-parser@^6.0.0: 772 | version "6.0.0" 773 | resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-6.0.0.tgz#a8fdc035863a95b2c1dc5ebf4ecf80b4e76a1260" 774 | integrity sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw== 775 | dependencies: 776 | pug-error "^2.0.0" 777 | token-stream "1.0.0" 778 | 779 | pug-runtime@^3.0.0, pug-runtime@^3.0.1: 780 | version "3.0.1" 781 | resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-3.0.1.tgz#f636976204723f35a8c5f6fad6acda2a191b83d7" 782 | integrity sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg== 783 | 784 | pug-strip-comments@^2.0.0: 785 | version "2.0.0" 786 | resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz#f94b07fd6b495523330f490a7f554b4ff876303e" 787 | integrity sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ== 788 | dependencies: 789 | pug-error "^2.0.0" 790 | 791 | pug-walk@^2.0.0: 792 | version "2.0.0" 793 | resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-2.0.0.tgz#417aabc29232bb4499b5b5069a2b2d2a24d5f5fe" 794 | integrity sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ== 795 | 796 | pug@^3.0.2: 797 | version "3.0.2" 798 | resolved "https://registry.yarnpkg.com/pug/-/pug-3.0.2.tgz#f35c7107343454e43bc27ae0ff76c731b78ea535" 799 | integrity sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw== 800 | dependencies: 801 | pug-code-gen "^3.0.2" 802 | pug-filters "^4.0.0" 803 | pug-lexer "^5.0.1" 804 | pug-linker "^4.0.0" 805 | pug-load "^3.0.0" 806 | pug-parser "^6.0.0" 807 | pug-runtime "^3.0.1" 808 | pug-strip-comments "^2.0.0" 809 | 810 | readdirp@~3.6.0: 811 | version "3.6.0" 812 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 813 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 814 | dependencies: 815 | picomatch "^2.2.1" 816 | 817 | request-light@^0.5.4: 818 | version "0.5.4" 819 | resolved "https://registry.yarnpkg.com/request-light/-/request-light-0.5.4.tgz#497a98c6d8ae49536417a5e2d7f383b934f3e38c" 820 | integrity sha512-t3566CMweOFlUk7Y1DJMu5OrtpoZEb6aSTsLQVT3wtrIEJ5NhcY9G/Oqxvjllzl4a15zXfFlcr9q40LbLVQJqw== 821 | 822 | resolve@^1.15.1, resolve@^1.20.0: 823 | version "1.20.0" 824 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" 825 | integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== 826 | dependencies: 827 | is-core-module "^2.2.0" 828 | path-parse "^1.0.6" 829 | 830 | rollup@^2.38.5: 831 | version "2.56.3" 832 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.56.3.tgz#b63edadd9851b0d618a6d0e6af8201955a77aeff" 833 | integrity sha512-Au92NuznFklgQCUcV96iXlxUbHuB1vQMaH76DHl5M11TotjOHwqk9CwcrT78+Tnv4FN9uTBxq6p4EJoYkpyekg== 834 | optionalDependencies: 835 | fsevents "~2.3.2" 836 | 837 | sass@^1.39.2: 838 | version "1.39.2" 839 | resolved "https://registry.yarnpkg.com/sass/-/sass-1.39.2.tgz#1681964378f58d76fc64a6a502619bd5ac99f660" 840 | integrity sha512-4/6Vn2RPc+qNwSclUSKvssh7dqK1Ih3FfHBW16I/GfH47b3scbYeOw65UIrYG7PkweFiKbpJjgkf5CV8EMmvzw== 841 | dependencies: 842 | chokidar ">=3.0.0 <4.0.0" 843 | 844 | select@^1.1.2: 845 | version "1.1.2" 846 | resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" 847 | integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0= 848 | 849 | semver@^7.3.5: 850 | version "7.3.5" 851 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" 852 | integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== 853 | dependencies: 854 | lru-cache "^6.0.0" 855 | 856 | source-map-js@^0.6.2: 857 | version "0.6.2" 858 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" 859 | integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== 860 | 861 | source-map@^0.6.1: 862 | version "0.6.1" 863 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 864 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 865 | 866 | sourcemap-codec@^1.4.4: 867 | version "1.4.8" 868 | resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" 869 | integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== 870 | 871 | string-hash@^1.1.1: 872 | version "1.1.3" 873 | resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" 874 | integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs= 875 | 876 | tiny-emitter@^2.0.0: 877 | version "2.1.0" 878 | resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" 879 | integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== 880 | 881 | to-fast-properties@^2.0.0: 882 | version "2.0.0" 883 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" 884 | integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= 885 | 886 | to-regex-range@^5.0.1: 887 | version "5.0.1" 888 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 889 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 890 | dependencies: 891 | is-number "^7.0.0" 892 | 893 | token-stream@1.0.0: 894 | version "1.0.0" 895 | resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-1.0.0.tgz#cc200eab2613f4166d27ff9afc7ca56d49df6eb4" 896 | integrity sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ= 897 | 898 | typescript@^4.3.2: 899 | version "4.4.3" 900 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.3.tgz#bdc5407caa2b109efd4f82fe130656f977a29324" 901 | integrity sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA== 902 | 903 | upath@^2.0.1: 904 | version "2.0.1" 905 | resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" 906 | integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== 907 | 908 | util-deprecate@^1.0.2: 909 | version "1.0.2" 910 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 911 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 912 | 913 | vite@^2.5.4: 914 | version "2.5.6" 915 | resolved "https://registry.yarnpkg.com/vite/-/vite-2.5.6.tgz#51431bb5b99b041289595300ba15947bad0f89aa" 916 | integrity sha512-P++qzXuOPhTql8iDamsatlJfD7/yGi8NCNwzyqkB2p0jrNJC567WEdXiKn3hQ+ZV8amQmB2dTH6svo3Z2tJ6MQ== 917 | dependencies: 918 | esbuild "^0.12.17" 919 | postcss "^8.3.6" 920 | resolve "^1.20.0" 921 | rollup "^2.38.5" 922 | optionalDependencies: 923 | fsevents "~2.3.2" 924 | 925 | void-elements@^3.1.0: 926 | version "3.1.0" 927 | resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" 928 | integrity sha1-YU9/v42AHwu18GYfWy9XhXUOTwk= 929 | 930 | vscode-css-languageservice@^5.1.4: 931 | version "5.1.5" 932 | resolved "https://registry.yarnpkg.com/vscode-css-languageservice/-/vscode-css-languageservice-5.1.5.tgz#400b2f63a4f73c60f5b0afc48c478c1b326b27c6" 933 | integrity sha512-c1hhsbnZ7bBvj10vMDLmkOk/n9r0rXQYDj4kbBi59bZaaEZ3e81zURx76/618NZM5NytlZmGfvmxQtB7mb03Ow== 934 | dependencies: 935 | vscode-languageserver-textdocument "^1.0.1" 936 | vscode-languageserver-types "^3.16.0" 937 | vscode-nls "^5.0.0" 938 | vscode-uri "^3.0.2" 939 | 940 | vscode-html-languageservice@^4.0.7: 941 | version "4.0.8" 942 | resolved "https://registry.yarnpkg.com/vscode-html-languageservice/-/vscode-html-languageservice-4.0.8.tgz#9429bacce3244dcfcb3a7172903f33b6f418db3b" 943 | integrity sha512-VJ4boG3uOD5Ls0pCvml7ZkHY+f1uDuxr+wR39XrerPr7qQFAu91DRTBuOzBsp6lV3x5Vz2S835AS2ZzLNmezbg== 944 | dependencies: 945 | vscode-languageserver-textdocument "^1.0.1" 946 | vscode-languageserver-types "^3.16.0" 947 | vscode-nls "^5.0.0" 948 | vscode-uri "^3.0.2" 949 | 950 | vscode-json-languageservice@^4.1.7: 951 | version "4.1.7" 952 | resolved "https://registry.yarnpkg.com/vscode-json-languageservice/-/vscode-json-languageservice-4.1.7.tgz#18244d62b115a5818c7526ef4339438b7175dfaa" 953 | integrity sha512-cwG5TwZyHYthsk2aS3W1dVgVP6Vwn3o+zscwN58uMgZt/nKuyxd9vdEB1F58Ix+S5kSKAnkUCP6hvulcoImQQQ== 954 | dependencies: 955 | jsonc-parser "^3.0.0" 956 | vscode-languageserver-textdocument "^1.0.1" 957 | vscode-languageserver-types "^3.16.0" 958 | vscode-nls "^5.0.0" 959 | vscode-uri "^3.0.2" 960 | 961 | vscode-jsonrpc@8.0.0-next.2, vscode-jsonrpc@^8.0.0-next.2: 962 | version "8.0.0-next.2" 963 | resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.0.0-next.2.tgz#285fc294be586e4768acd67e5a42efc738a5cac0" 964 | integrity sha512-gxUyTBAjmwGkiHW/UaRScre2s4i98P8M7gnc3VB4DrVQUm3vQ0idi2cN9nbkfcjATx+uEt8C22j+MLN/8UzsJA== 965 | 966 | vscode-languageserver-protocol@3.17.0-next.8: 967 | version "3.17.0-next.8" 968 | resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.0-next.8.tgz#ef2eb7423b474cccd11384239de24488e7fe818c" 969 | integrity sha512-P89vSuJ+FA5JzFmcOoZN13Ig1yd6LsiPOig0O5m5BSGuO/rplQegCd9J0wKpaTy7trf/SYHRoypnbUBdzy14sg== 970 | dependencies: 971 | vscode-jsonrpc "8.0.0-next.2" 972 | vscode-languageserver-types "3.17.0-next.3" 973 | 974 | vscode-languageserver-textdocument@^1.0.1: 975 | version "1.0.1" 976 | resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.1.tgz#178168e87efad6171b372add1dea34f53e5d330f" 977 | integrity sha512-UIcJDjX7IFkck7cSkNNyzIz5FyvpQfY7sdzVy+wkKN/BLaD4DQ0ppXQrKePomCxTS7RrolK1I0pey0bG9eh8dA== 978 | 979 | vscode-languageserver-types@3.17.0-next.3: 980 | version "3.17.0-next.3" 981 | resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.0-next.3.tgz#e1f4311e08ea3193e81126154b6a342fc1c3dba3" 982 | integrity sha512-VQcXnhKYxUW6OiRMhG++SzmZYMJwusXknJGd+FfdOnS1yHAo734OHyR0e2eEHDlv0/oWc8RZPgx/VKSKyondVg== 983 | 984 | vscode-languageserver-types@^3.15.1, vscode-languageserver-types@^3.16.0: 985 | version "3.16.0" 986 | resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz#ecf393fc121ec6974b2da3efb3155644c514e247" 987 | integrity sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA== 988 | 989 | vscode-languageserver@^8.0.0-next.2: 990 | version "8.0.0-next.2" 991 | resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-8.0.0-next.2.tgz#3a3daf79ff10350ea9cec5c73b5302901a955117" 992 | integrity sha512-7qCEXTeGZKkI8BGvlKh0JPXTY7BaWoiwQYKCcGaUgnMs34wt6F/yaKcxoC3XIouBBVyRxiI6Ml/JdztM3XYEaA== 993 | dependencies: 994 | vscode-languageserver-protocol "3.17.0-next.8" 995 | 996 | vscode-nls@^5.0.0: 997 | version "5.0.0" 998 | resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-5.0.0.tgz#99f0da0bd9ea7cda44e565a74c54b1f2bc257840" 999 | integrity sha512-u0Lw+IYlgbEJFF6/qAqG2d1jQmJl0eyAGJHoAJqr2HT4M2BNuQYSEiSE75f52pXHSJm8AlTjnLLbBFPrdz2hpA== 1000 | 1001 | vscode-pug-languageservice@^0.27.14: 1002 | version "0.27.14" 1003 | resolved "https://registry.yarnpkg.com/vscode-pug-languageservice/-/vscode-pug-languageservice-0.27.14.tgz#3426f05a178264f22191d5fdd9fea80889ead464" 1004 | integrity sha512-nRy0wybs7s7aQB951szo9THPDoIDv4bdTsuAyFkQMpiKsRk2/C6LtPAQYVzCBOqgBM9RVagBirbLWOAEdkMc2w== 1005 | dependencies: 1006 | "@volar/code-gen" "^0.27.14" 1007 | "@volar/shared" "^0.27.14" 1008 | "@volar/source-map" "^0.27.14" 1009 | "@volar/transforms" "^0.27.14" 1010 | pug-lexer "^5.0.1" 1011 | pug-parser "^6.0.0" 1012 | vscode-languageserver "^8.0.0-next.2" 1013 | 1014 | vscode-typescript-languageservice@^0.27.18: 1015 | version "0.27.18" 1016 | resolved "https://registry.yarnpkg.com/vscode-typescript-languageservice/-/vscode-typescript-languageservice-0.27.18.tgz#a4a1b63a41706ae7ece1300f3402a4732ba7c588" 1017 | integrity sha512-JyrxQk4FNKDvL6hkpqLQhyZovGhMvXM076TV3vHEYACOhTumnowpFZeNMkCsp8tkP83lrFzy1B3fAnDDa9HfrQ== 1018 | dependencies: 1019 | "@volar/shared" "^0.27.14" 1020 | semver "^7.3.5" 1021 | upath "^2.0.1" 1022 | vscode-languageserver "^8.0.0-next.2" 1023 | vscode-languageserver-textdocument "^1.0.1" 1024 | 1025 | vscode-uri@^2.1.2: 1026 | version "2.1.2" 1027 | resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-2.1.2.tgz#c8d40de93eb57af31f3c715dd650e2ca2c096f1c" 1028 | integrity sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A== 1029 | 1030 | vscode-uri@^3.0.2: 1031 | version "3.0.2" 1032 | resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.2.tgz#ecfd1d066cb8ef4c3a208decdbab9a8c23d055d0" 1033 | integrity sha512-jkjy6pjU1fxUvI51P+gCsxg1u2n8LSt0W6KrCNQceaziKzff74GoWmjVG46KieVzybO1sttPQmYfrwSHey7GUA== 1034 | 1035 | vscode-vue-languageservice@^0.27.0: 1036 | version "0.27.18" 1037 | resolved "https://registry.yarnpkg.com/vscode-vue-languageservice/-/vscode-vue-languageservice-0.27.18.tgz#96b45611b1d9a34b6006df10a6669e929268ec02" 1038 | integrity sha512-yvuqPGbZgGCdY1b3MWEKJR6ptDnIFHOcgsO3bJKhCIUMhR5ZJ2FUwTpwrz5T9iEasOPgfN+e1gfbkZ+BYUAXbg== 1039 | dependencies: 1040 | "@volar/code-gen" "^0.27.14" 1041 | "@volar/html2pug" "^0.27.13" 1042 | "@volar/shared" "^0.27.14" 1043 | "@volar/source-map" "^0.27.14" 1044 | "@volar/transforms" "^0.27.14" 1045 | "@vscode/emmet-helper" "^2.7.0" 1046 | "@vue/compiler-dom" "^3.2.6" 1047 | "@vue/reactivity" "^3.2.6" 1048 | "@vue/shared" "^3.2.6" 1049 | request-light "^0.5.4" 1050 | upath "^2.0.1" 1051 | vscode-css-languageservice "^5.1.4" 1052 | vscode-html-languageservice "^4.0.7" 1053 | vscode-json-languageservice "^4.1.7" 1054 | vscode-languageserver "^8.0.0-next.2" 1055 | vscode-languageserver-textdocument "^1.0.1" 1056 | vscode-pug-languageservice "^0.27.14" 1057 | vscode-typescript-languageservice "^0.27.18" 1058 | 1059 | vue-tsc@^0.2.2: 1060 | version "0.2.3" 1061 | resolved "https://registry.yarnpkg.com/vue-tsc/-/vue-tsc-0.2.3.tgz#12bf48e3c9b1e553d31aad0c641722d5d15841d8" 1062 | integrity sha512-0ahxAnQolmv6EOnv5zxeMi4vCpM4PkhjU70i/EI44OzMWq4OErjLZhEh8EXOLtMx6FBRuuqS5fiBXcuqLpoL7Q== 1063 | dependencies: 1064 | vscode-vue-languageservice "^0.27.0" 1065 | 1066 | vue3-clipboard@^1.0.0: 1067 | version "1.0.0" 1068 | resolved "https://registry.yarnpkg.com/vue3-clipboard/-/vue3-clipboard-1.0.0.tgz#f7d17a00bce6579ba866df825541563b272610f2" 1069 | integrity sha512-GUqKh1oO79xDpq0z+cCv/NDVTpcJGNDzeNgT3PmTdTp/WJh3gcTrDqIYKycKhzMFOtIFJ7hO/+usgyWtT+fNhA== 1070 | dependencies: 1071 | clipboard "^2.0.6" 1072 | 1073 | vue@^3.2.6: 1074 | version "3.2.11" 1075 | resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.11.tgz#6b92295048df705ddac558fd3e3ed553e55e57c8" 1076 | integrity sha512-JkI3/eIgfk4E0f/p319TD3EZgOwBQfftgnkRsXlT7OrRyyiyoyUXn6embPGZXSBxD3LoZ9SWhJoxLhFh5AleeA== 1077 | dependencies: 1078 | "@vue/compiler-dom" "3.2.11" 1079 | "@vue/runtime-dom" "3.2.11" 1080 | "@vue/shared" "3.2.11" 1081 | 1082 | with@^7.0.0: 1083 | version "7.0.2" 1084 | resolved "https://registry.yarnpkg.com/with/-/with-7.0.2.tgz#ccee3ad542d25538a7a7a80aad212b9828495bac" 1085 | integrity sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w== 1086 | dependencies: 1087 | "@babel/parser" "^7.9.6" 1088 | "@babel/types" "^7.9.6" 1089 | assert-never "^1.2.1" 1090 | babel-walk "3.0.0-canary-5" 1091 | 1092 | yallist@^3.0.2: 1093 | version "3.1.1" 1094 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" 1095 | integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== 1096 | 1097 | yallist@^4.0.0: 1098 | version "4.0.0" 1099 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 1100 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 1101 | --------------------------------------------------------------------------------