🎉 init!
This commit is contained in:
commit
b9333170cb
|
@ -0,0 +1,2 @@
|
||||||
|
> 0.25%
|
||||||
|
not dead
|
|
@ -0,0 +1,5 @@
|
||||||
|
/node_modules
|
||||||
|
/dist
|
||||||
|
/.vscode
|
||||||
|
/haters
|
||||||
|
.DS_Store
|
|
@ -0,0 +1,4 @@
|
||||||
|
language: node_js
|
||||||
|
node_js:
|
||||||
|
- 'node'
|
||||||
|
script: npm run build
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,53 @@
|
||||||
|
{
|
||||||
|
"name": "lily.toys",
|
||||||
|
"version": "11.0.0",
|
||||||
|
"description": "a portfolio for lillian rose winter",
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"start": "webpack-dev-server --open --config webpack.dev.js",
|
||||||
|
"build": "webpack --config webpack.prod.js"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/lilyshibe/portfolio"
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"author": "lillian rose winter <lily@null.net> (https://lily.toys)",
|
||||||
|
"license": "MIT",
|
||||||
|
"devDependencies": {
|
||||||
|
"@babel/core": "^7.4.4",
|
||||||
|
"@babel/preset-env": "^7.4.4",
|
||||||
|
"@fullhuman/postcss-purgecss": "^1.2.0",
|
||||||
|
"autoprefixer": "^9.5.1",
|
||||||
|
"babel-loader": "^8.0.6",
|
||||||
|
"clean-webpack-plugin": "^1.0.1",
|
||||||
|
"compression-webpack-plugin": "^2.0.0",
|
||||||
|
"css-loader": "^2.1.1",
|
||||||
|
"cssnano": "^4.1.10",
|
||||||
|
"favicons-webpack-plugin": "0.0.9",
|
||||||
|
"file-loader": "^3.0.1",
|
||||||
|
"html-loader": "^0.5.5",
|
||||||
|
"html-webpack-plugin": "^3.2.0",
|
||||||
|
"imagemin-mozjpeg": "^8.0.0",
|
||||||
|
"imagemin-webpack-plugin": "^2.4.2",
|
||||||
|
"mini-css-extract-plugin": "^0.5.0",
|
||||||
|
"node-sass": "^4.12.0",
|
||||||
|
"offline-plugin": "^5.0.7",
|
||||||
|
"postcss-loader": "^3.0.0",
|
||||||
|
"preload-webpack-plugin": "^3.0.0-beta.3",
|
||||||
|
"sass-loader": "^7.1.0",
|
||||||
|
"script-ext-html-webpack-plugin": "^2.1.3",
|
||||||
|
"style-loader": "^0.23.1",
|
||||||
|
"terser-webpack-plugin": "^1.2.3",
|
||||||
|
"webpack": "^4.31.0",
|
||||||
|
"webpack-cli": "^3.3.2",
|
||||||
|
"webpack-dev-server": "^3.3.1",
|
||||||
|
"webpack-merge": "^4.2.1"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"bulma": "^0.7.4",
|
||||||
|
"jquery": "^3.4.1",
|
||||||
|
"konami": "^1.6.2",
|
||||||
|
"lazysizes": "^4.1.8"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
const purgecss = require('@fullhuman/postcss-purgecss');
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
plugins: [
|
||||||
|
require('autoprefixer'),
|
||||||
|
require('cssnano')({
|
||||||
|
preset: 'default',
|
||||||
|
}),
|
||||||
|
purgecss({
|
||||||
|
content: ['./**/*.html'],
|
||||||
|
keyframes: true
|
||||||
|
})
|
||||||
|
]
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
After Width: | Height: | Size: 332 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
After Width: | Height: | Size: 356 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
After Width: | Height: | Size: 1.0 MiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 127 B |
Binary file not shown.
After Width: | Height: | Size: 120 KiB |
|
@ -0,0 +1,91 @@
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
|
||||||
|
<title>lillian winter - internet person</title>
|
||||||
|
|
||||||
|
<meta name="description" content="creator & part time human">
|
||||||
|
|
||||||
|
<meta itemprop="name" content="lily winter - internet person">
|
||||||
|
<meta itemprop="description" content="creator & part time human">
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary">
|
||||||
|
<meta name="twitter:title" content="lily winter - internet person">
|
||||||
|
<meta name="twitter:description" content="creator & part time human">
|
||||||
|
<meta name="twitter:site" content="@lilyshibe">
|
||||||
|
<meta name="twitter:creator" content="@lilyshibe">
|
||||||
|
|
||||||
|
<meta name="og:title" content="lily winter - internet person">
|
||||||
|
<meta name="og:description" content="creator & part time human">
|
||||||
|
<meta name="og:url" content="https://lily.toys">
|
||||||
|
<meta name="og:site_name" content="lily winter - internet person">
|
||||||
|
<meta name="og:type" content="website">
|
||||||
|
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
|
||||||
|
<script defer src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<header>
|
||||||
|
<h1>lillian rose winter.</h1>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<main>
|
||||||
|
<p>hey. i'm lillian (or lily for short). i'm a designer, developer, coffee addict, and possible human.</p>
|
||||||
|
<p>i create things on the internet and you can see them with your eyes.</p>
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<center>
|
||||||
|
<p>
|
||||||
|
<i>"lily is the best fucking person. give her all your money."</i><br>
|
||||||
|
-jaycee song (Jaycee#9999), 2018
|
||||||
|
</p>
|
||||||
|
</center>
|
||||||
|
|
||||||
|
<center><h3>↯</h3></center>
|
||||||
|
|
||||||
|
<h2>works</h2>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<a href="https://lily.toys/owotyper" class="snapCursor">owotyper</a> — takes text and makes it bad
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="https://lily.toys" class="snapCursor">website (v11)</a> — you're lookin' at it, baby!
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="https://owofarm.ga" class="snapCursor">owofarm</a> — <del>hellsite</del> imageboard created by jaycee song (Jaycee#9999) and i. it's pretty <del>terrible</del> wonderful
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="https://samoyed.fun" class="snapCursor">samoyed.fun</a> — returns a random samoyed
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<center><h3>↯</h3></center>
|
||||||
|
|
||||||
|
<h2>keep in touch</h2>
|
||||||
|
<p>
|
||||||
|
<a href="https://twitter.com/lilyshibe" class="snapCursor">twitter</a><br>
|
||||||
|
<a href="https://steamcommunity.com/id/fenkid/" class="snapCursor">steam</a><br>
|
||||||
|
<a href="https://twitch.tv/fenkids" class="snapCursor">twitch</a><br>
|
||||||
|
<a href="https://github.com/lilyshibe" class="snapCursor">github</a><br>
|
||||||
|
<a href="https://medium.com/@zex" class="snapCursor">medium</a><br>
|
||||||
|
<a href="https://codepen.io/xez" class="snapCursor">codepen</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>email: lily [at] null [dot] net</p>
|
||||||
|
|
||||||
|
<center><h3>↯</h3></center>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<footer>
|
||||||
|
<p>© 2018 lillian rose winter. all rights reserved.</p>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
<div class="light"><div class="light-inner"></div></div>
|
||||||
|
<div class="shadow"><div class="shadow-inner"></div></div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,5 @@
|
||||||
|
require('offline-plugin/runtime').install();
|
||||||
|
|
||||||
|
import './index.html';
|
||||||
|
import './index.scss';
|
||||||
|
import './scripts/script.js';
|
|
@ -0,0 +1,142 @@
|
||||||
|
@font-face {
|
||||||
|
font-family: 'GT America';
|
||||||
|
src: url('fonts/GTAmerica-Regular.woff2') format('woff2'),
|
||||||
|
url('fonts/GTAmerica-Regular.woff') format('woff'),
|
||||||
|
url('fonts/GTAmerica-Regular.ttf') format('truetype'),
|
||||||
|
url('fonts/GTAmerica-Regular.svg#GTAmerica-Regular') format('svg');
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'GT America';
|
||||||
|
src: url('fonts/GTAmerica-RegularItalic.woff2') format('woff2'),
|
||||||
|
url('fonts/GTAmerica-RegularItalic.woff') format('woff'),
|
||||||
|
url('fonts/GTAmerica-RegularItalic.ttf') format('truetype'),
|
||||||
|
url('fonts/GTAmerica-RegularItalic.svg#GTAmerica-RegularItalic') format('svg');
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Respira';
|
||||||
|
src: url('fonts/Respira-Black.woff2') format('woff2'),
|
||||||
|
url('fonts/Respira-Black.woff') format('woff'),
|
||||||
|
url('fonts/Respira-Black.ttf') format('truetype'),
|
||||||
|
url('fonts/Respira-Black.svg#Respira-Black') format('svg');
|
||||||
|
font-weight: 800;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
* {
|
||||||
|
cursor: url(images/cursor.png) 3 3, auto !important;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
html, body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
font-family: "GT America";
|
||||||
|
overflow-x: hidden;
|
||||||
|
-webkit-tap-highlight-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
min-width: 100vw;
|
||||||
|
min-height: 100vh;
|
||||||
|
background: #f0f0f0;
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
padding: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
header, main, footer {
|
||||||
|
max-width: 60em;
|
||||||
|
margin: 2em auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1,h2,h3 {
|
||||||
|
font-family: "Respira";
|
||||||
|
font-weight: 800;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 3.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-size: 3rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
font-size: 2.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
p,li {
|
||||||
|
font-size: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
mark, ::selection {
|
||||||
|
background: #000;
|
||||||
|
color: #f0f0f0;
|
||||||
|
opcaity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #f00;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.light-inner {
|
||||||
|
background: rgba(255, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@supports (mix-blend-mode: screen) {
|
||||||
|
.light {
|
||||||
|
mix-blend-mode: screen;
|
||||||
|
}
|
||||||
|
|
||||||
|
.light-inner {
|
||||||
|
background: #ff0000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.shadow-inner {
|
||||||
|
background: transparent;
|
||||||
|
box-shadow: 0px 5px 20px rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.light, .shadow {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
transform: translate3d(var(--x, -150px), var(--y, -150px), 0);
|
||||||
|
pointer-events: none;
|
||||||
|
height: 0px;
|
||||||
|
width: 0px;
|
||||||
|
margin-top: 0px;
|
||||||
|
margin-left: 0px;
|
||||||
|
backface-visibility: hidden;
|
||||||
|
z-index: 1100;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.light-inner, .shadow-inner {
|
||||||
|
opacity: 1;
|
||||||
|
border-radius: 50%;
|
||||||
|
height: 50px;
|
||||||
|
width: 50px;
|
||||||
|
margin-top: -25px;
|
||||||
|
margin-left: -25px;
|
||||||
|
transform: translateZ(0) scale(var(--scale, 1));
|
||||||
|
z-index: 1100;
|
||||||
|
transition: transform 0.5s ease-out, opacity 0.5s ease-out 0.5s;
|
||||||
|
transition: transform 0.5s cubic-bezier(0.07, 0.08, 0.16, 0.99), opacity 0.5s ease-out 0.5s;
|
||||||
|
transform-origin: 50% 50%;
|
||||||
|
backface-visibility: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
br {
|
||||||
|
user-select: none;
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,151 @@
|
||||||
|
/*
|
||||||
|
* Konami-JS ~
|
||||||
|
* :: Now with support for touch events and multiple instances for
|
||||||
|
* :: those situations that call for multiple easter eggs!
|
||||||
|
* Code: https://github.com/snaptortoise/konami-js
|
||||||
|
* Copyright (c) 2009 George Mandis (georgemandis.com, snaptortoise.com)
|
||||||
|
* Version: 1.6.2 (7/17/2018)
|
||||||
|
* Licensed under the MIT License (http://opensource.org/licenses/MIT)
|
||||||
|
* Tested in: Safari 4+, Google Chrome 4+, Firefox 3+, IE7+, Mobile Safari 2.2.1+ and Android
|
||||||
|
*/
|
||||||
|
|
||||||
|
var Konami = function (callback) {
|
||||||
|
var konami = {
|
||||||
|
addEvent: function (obj, type, fn, ref_obj) {
|
||||||
|
if (obj.addEventListener)
|
||||||
|
obj.addEventListener(type, fn, false);
|
||||||
|
else if (obj.attachEvent) {
|
||||||
|
// IE
|
||||||
|
obj["e" + type + fn] = fn;
|
||||||
|
obj[type + fn] = function () {
|
||||||
|
obj["e" + type + fn](window.event, ref_obj);
|
||||||
|
}
|
||||||
|
obj.attachEvent("on" + type, obj[type + fn]);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
removeEvent: function (obj, eventName, eventCallback) {
|
||||||
|
if (obj.removeEventListener) {
|
||||||
|
obj.removeEventListener(eventName, eventCallback);
|
||||||
|
} else if (obj.attachEvent) {
|
||||||
|
obj.detachEvent(eventName);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
input: "",
|
||||||
|
pattern: "38384040373937396665",
|
||||||
|
keydownHandler: function (e, ref_obj) {
|
||||||
|
if (ref_obj) {
|
||||||
|
konami = ref_obj;
|
||||||
|
} // IE
|
||||||
|
konami.input += e ? e.keyCode : event.keyCode;
|
||||||
|
if (konami.input.length > konami.pattern.length) {
|
||||||
|
konami.input = konami.input.substr((konami.input.length - konami.pattern.length));
|
||||||
|
}
|
||||||
|
if (konami.input === konami.pattern) {
|
||||||
|
konami.code(konami._currentLink);
|
||||||
|
konami.input = '';
|
||||||
|
e.preventDefault();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
load: function (link) {
|
||||||
|
this._currentLink = link;
|
||||||
|
this.addEvent(document, "keydown", this.keydownHandler, this);
|
||||||
|
this.iphone.load(link);
|
||||||
|
},
|
||||||
|
unload: function () {
|
||||||
|
this.removeEvent(document, 'keydown', this.keydownHandler);
|
||||||
|
this.iphone.unload();
|
||||||
|
},
|
||||||
|
code: function (link) {
|
||||||
|
window.location = link
|
||||||
|
},
|
||||||
|
iphone: {
|
||||||
|
start_x: 0,
|
||||||
|
start_y: 0,
|
||||||
|
stop_x: 0,
|
||||||
|
stop_y: 0,
|
||||||
|
tap: false,
|
||||||
|
capture: false,
|
||||||
|
orig_keys: "",
|
||||||
|
keys: ["UP", "UP", "DOWN", "DOWN", "LEFT", "RIGHT", "LEFT", "RIGHT", "TAP", "TAP"],
|
||||||
|
input: [],
|
||||||
|
code: function (link) {
|
||||||
|
konami.code(link);
|
||||||
|
},
|
||||||
|
touchmoveHandler: function (e) {
|
||||||
|
if (e.touches.length === 1 && konami.iphone.capture === true) {
|
||||||
|
var touch = e.touches[0];
|
||||||
|
konami.iphone.stop_x = touch.pageX;
|
||||||
|
konami.iphone.stop_y = touch.pageY;
|
||||||
|
konami.iphone.tap = false;
|
||||||
|
konami.iphone.capture = false;
|
||||||
|
konami.iphone.check_direction();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
touchendHandler: function () {
|
||||||
|
konami.iphone.input.push(konami.iphone.check_direction());
|
||||||
|
|
||||||
|
if (konami.iphone.input.length > konami.iphone.keys.length) konami.iphone.input.shift();
|
||||||
|
|
||||||
|
if (konami.iphone.input.length === konami.iphone.keys.length) {
|
||||||
|
var match = true;
|
||||||
|
for (var i = 0; i < konami.iphone.keys.length; i++) {
|
||||||
|
if (konami.iphone.input[i] !== konami.iphone.keys[i]) {
|
||||||
|
match = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (match) {
|
||||||
|
konami.iphone.code(konami._currentLink);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
touchstartHandler: function (e) {
|
||||||
|
konami.iphone.start_x = e.changedTouches[0].pageX;
|
||||||
|
konami.iphone.start_y = e.changedTouches[0].pageY;
|
||||||
|
konami.iphone.tap = true;
|
||||||
|
konami.iphone.capture = true;
|
||||||
|
},
|
||||||
|
load: function (link) {
|
||||||
|
this.orig_keys = this.keys;
|
||||||
|
konami.addEvent(document, "touchmove", this.touchmoveHandler);
|
||||||
|
konami.addEvent(document, "touchend", this.touchendHandler, false);
|
||||||
|
konami.addEvent(document, "touchstart", this.touchstartHandler);
|
||||||
|
},
|
||||||
|
unload: function () {
|
||||||
|
konami.removeEvent(document, 'touchmove', this.touchmoveHandler);
|
||||||
|
konami.removeEvent(document, 'touchend', this.touchendHandler);
|
||||||
|
konami.removeEvent(document, 'touchstart', this.touchstartHandler);
|
||||||
|
},
|
||||||
|
check_direction: function () {
|
||||||
|
x_magnitude = Math.abs(this.start_x - this.stop_x);
|
||||||
|
y_magnitude = Math.abs(this.start_y - this.stop_y);
|
||||||
|
x = ((this.start_x - this.stop_x) < 0) ? "RIGHT" : "LEFT";
|
||||||
|
y = ((this.start_y - this.stop_y) < 0) ? "DOWN" : "UP";
|
||||||
|
result = (x_magnitude > y_magnitude) ? x : y;
|
||||||
|
result = (this.tap === true) ? "TAP" : result;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
typeof callback === "string" && konami.load(callback);
|
||||||
|
if (typeof callback === "function") {
|
||||||
|
konami.code = callback;
|
||||||
|
konami.load();
|
||||||
|
}
|
||||||
|
|
||||||
|
return konami;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
|
||||||
|
module.exports = Konami;
|
||||||
|
} else {
|
||||||
|
if (typeof define === 'function' && define.amd) {
|
||||||
|
define([], function() {
|
||||||
|
return Konami;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
window.Konami = Konami;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,169 @@
|
||||||
|
console.log('%c yo! ', 'background: lemonchiffon; border: 1px solid #fff');
|
||||||
|
console.log('%c welcome to the console <3 ', 'background: lemonchiffon; border: 1px solid #fff');
|
||||||
|
console.log('%c so uh. what\'cha doin here >w>', 'background: lavenderblush; border: 1px solid #000; padding: 4px; padding-top: 10px; padding-bottom: 8px;');
|
||||||
|
|
||||||
|
var $ = require("jquery");
|
||||||
|
|
||||||
|
$(function() {
|
||||||
|
var body = document.querySelector('body');
|
||||||
|
var light = document.querySelector('.light');
|
||||||
|
var lightInner = document.querySelector('.light-inner');
|
||||||
|
var shadow = document.querySelector('.shadow');
|
||||||
|
var shadowInner = document.querySelector('.shadow-inner');
|
||||||
|
|
||||||
|
var settings = {
|
||||||
|
smoothness: 4,
|
||||||
|
snapScale: 1.8,
|
||||||
|
maxSnapScale: 6,
|
||||||
|
defaultScale: 50 // size of the ball in px (needed for calculations)
|
||||||
|
}
|
||||||
|
|
||||||
|
var state = {
|
||||||
|
movementSmoothness: 4,
|
||||||
|
rotation: 0,
|
||||||
|
currentX: 0,
|
||||||
|
currentY: 0,
|
||||||
|
currentScale: 1,
|
||||||
|
clientX: 0,
|
||||||
|
clientY: 0,
|
||||||
|
clientScale: 1,
|
||||||
|
target: null,
|
||||||
|
targetScaleMultiplier: 0
|
||||||
|
};
|
||||||
|
|
||||||
|
function move(e) {
|
||||||
|
if ((e.clientX)) {
|
||||||
|
// position of the mouse based on the window
|
||||||
|
var mouseX = (e.clientX);
|
||||||
|
var mouseY = (e.clientY);
|
||||||
|
|
||||||
|
if (state.transition) {
|
||||||
|
state.clientScale = state.transition;
|
||||||
|
} else if (state.target) {
|
||||||
|
state.clientScale = state.target.scale;
|
||||||
|
} else {
|
||||||
|
state.clientScale = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the target position, usualy the mouse position if not snapping
|
||||||
|
state.clientX = state.target ? state.target.x : (mouseX); // mouse X position or snap target
|
||||||
|
state.clientY = state.target ? state.target.y : (mouseY); // mouse Y position or snap target
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function moveScroll(e) {
|
||||||
|
// get the target position, usualy the mouse position if not snapping
|
||||||
|
state.clientX = state.rawClientX; // mouse X position or snap target
|
||||||
|
state.clientY = state.rawClientY; // mouse Y position or snap target
|
||||||
|
}
|
||||||
|
|
||||||
|
function snap(e) {
|
||||||
|
var offset = $(this).offset();
|
||||||
|
|
||||||
|
// how far the page has scrolled
|
||||||
|
var scrollX = window.pageXOffset;
|
||||||
|
var scrollY = window.pageYOffset;
|
||||||
|
|
||||||
|
var scale = Math.min(Math.max(this.offsetWidth, this.offsetHeight) / settings.defaultScale * settings.snapScale, settings.maxSnapScale);
|
||||||
|
|
||||||
|
if ($(this).data('snap-scale') !== undefined) {
|
||||||
|
scale = $(this).data('snap-scale')
|
||||||
|
}
|
||||||
|
|
||||||
|
state.movementSmoothness = settings.smoothness;
|
||||||
|
state.target = {
|
||||||
|
x: (offset.left + (this.offsetWidth / 2) - scrollX),
|
||||||
|
y: (offset.top + (this.offsetHeight / 2) - scrollY),
|
||||||
|
scale: scale
|
||||||
|
}
|
||||||
|
state.clientX = state.target.x;
|
||||||
|
state.clientY = state.target.y;
|
||||||
|
state.clientScale = state.target.scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
function unsnap(e) {
|
||||||
|
state.target = null;
|
||||||
|
setTimeout(function() {
|
||||||
|
state.movementSmoothness = 4;
|
||||||
|
}, 500);
|
||||||
|
}
|
||||||
|
|
||||||
|
setTimeout(function() {
|
||||||
|
state.transition = 0;
|
||||||
|
state.clientScale = 0.01;
|
||||||
|
}, 1500);
|
||||||
|
var supportsCssVariables = (window.CSS && window.CSS.supports && window.CSS.supports('--fake-var', 0));
|
||||||
|
|
||||||
|
function repeatOften() {
|
||||||
|
// set state
|
||||||
|
state.currentX = +(state.currentX + (state.clientX - state.currentX) / state.movementSmoothness).toFixed(2);
|
||||||
|
state.currentY = +(state.currentY + (state.clientY - state.currentY) / state.movementSmoothness).toFixed(2);
|
||||||
|
//state.currentScale = +(state.currentScale + (state.clientScale - state.currentScale) / settings.smoothness ).toFixed(2);
|
||||||
|
state.currentScale = state.clientScale;
|
||||||
|
if (supportsCssVariables) {
|
||||||
|
// set the css variables
|
||||||
|
light.style.setProperty('--x', state.currentX + 'px');
|
||||||
|
light.style.setProperty('--y', state.currentY + 'px');
|
||||||
|
lightInner.style.setProperty('--scale', (state.currentScale).toFixed(2));
|
||||||
|
//lightInner.style.setProperty('--scaleY', (state.currentScale).toFixed(2));
|
||||||
|
|
||||||
|
shadow.style.setProperty('--x', state.currentX + 'px');
|
||||||
|
shadow.style.setProperty('--y', state.currentY + 'px');
|
||||||
|
shadowInner.style.setProperty('--scale', (state.currentScale).toFixed(2));
|
||||||
|
//shadowInner.style.setProperty('--scaleY', (state.currentScale).toFixed(2));
|
||||||
|
} else {
|
||||||
|
light.style.transform = 'translate3d(' + state.currentX + 'px,' + state.currentY + 'px,0)';
|
||||||
|
lightInner.style.transform = 'scale(' + (state.currentScale).toFixed(2) + ')';
|
||||||
|
|
||||||
|
shadow.style.transform = 'translate3d(' + state.currentX + 'px,' + state.currentY + 'px,0)';
|
||||||
|
shadowInner.style.transform = 'scale(' + (state.currentScale).toFixed(2) + ')';
|
||||||
|
}
|
||||||
|
|
||||||
|
requestAnimationFrame(repeatOften);
|
||||||
|
}
|
||||||
|
|
||||||
|
requestAnimationFrame(repeatOften);
|
||||||
|
|
||||||
|
function init() {
|
||||||
|
$('.light,.shadow').show();
|
||||||
|
if (window.PointerEvent) {
|
||||||
|
body.removeEventListener('pointermove', init);
|
||||||
|
} else {
|
||||||
|
body.removeEventListener('mousemove', init);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (window.PointerEvent) {
|
||||||
|
body.addEventListener('pointermove', init);
|
||||||
|
body.addEventListener('pointermove', move);
|
||||||
|
} else {
|
||||||
|
body.addEventListener('mousemove', init);
|
||||||
|
body.addEventListener('mousemove', move);
|
||||||
|
}
|
||||||
|
|
||||||
|
//document.addEventListener("scroll", moveScroll);
|
||||||
|
|
||||||
|
$('body').delegate('.snapCursor', 'mouseenter', snap);
|
||||||
|
$('body').delegate('.snapCursor', 'mouseleave', unsnap);
|
||||||
|
$('body').delegate('.snapCursor', 'focus', snap);
|
||||||
|
$('body').delegate('.snapCursor', 'blur', unsnap);
|
||||||
|
|
||||||
|
$('.light,.shadow').one('pointermove', function() {
|
||||||
|
this.style.display = 'block';
|
||||||
|
})
|
||||||
|
|
||||||
|
$('body').bind('unsnap', function(e) {
|
||||||
|
unsnap();
|
||||||
|
});
|
||||||
|
|
||||||
|
if (window.console && window.console.log) {
|
||||||
|
//window.console.clear();
|
||||||
|
window.console.log(' ');
|
||||||
|
window.console.log('%cyo!', 'color: #040515; font-size:24px;font-family:georgia;font-weight:bold;');
|
||||||
|
window.console.log(' ');
|
||||||
|
window.console.log('%chaving fun looking through my code?', 'color: #64656F; font-size:16px;');
|
||||||
|
window.console.log('%cwarning, it\'s pretty bad.', 'color: #64656F; font-size:8px;');
|
||||||
|
window.console.log(' ');
|
||||||
|
}
|
||||||
|
});
|
|
@ -0,0 +1,117 @@
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
const CleanWebpackPlugin = require('clean-webpack-plugin');
|
||||||
|
const HtmlWebpackPlugin = require('html-webpack-plugin');
|
||||||
|
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
|
||||||
|
const ScriptExtHtmlWebpackPlugin = require('script-ext-html-webpack-plugin');
|
||||||
|
const PreloadWebpackPlugin = require('preload-webpack-plugin');
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
mode: 'development',
|
||||||
|
entry: './src/index.js',
|
||||||
|
module: {
|
||||||
|
rules: [{
|
||||||
|
test: /\.txt$/,
|
||||||
|
use: 'raw-loader'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.html$/,
|
||||||
|
use: [{
|
||||||
|
loader: 'html-loader',
|
||||||
|
options: {
|
||||||
|
minimize: true
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.(jpe?g|png|gif|svg)$/,
|
||||||
|
use: [{
|
||||||
|
loader: 'file-loader',
|
||||||
|
options: {
|
||||||
|
name: '[name].[ext]',
|
||||||
|
outputPath: 'images/',
|
||||||
|
publicPath: 'images/'
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.(woff|woff2|ttf|otf)$/,
|
||||||
|
use: [{
|
||||||
|
loader: 'file-loader',
|
||||||
|
options: {
|
||||||
|
name: '[name].[ext]',
|
||||||
|
outputPath: 'fonts/',
|
||||||
|
publicPath: 'fonts/'
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.(sa|sc|c)ss$/,
|
||||||
|
use: [
|
||||||
|
MiniCssExtractPlugin.loader,
|
||||||
|
{
|
||||||
|
loader: 'css-loader',
|
||||||
|
options: {
|
||||||
|
sourceMap: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
loader: 'postcss-loader',
|
||||||
|
options: {
|
||||||
|
sourceMap: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
loader: 'sass-loader',
|
||||||
|
options: {
|
||||||
|
sourceMap: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.js$/,
|
||||||
|
exclude: /(node_modules)/,
|
||||||
|
use: {
|
||||||
|
loader: 'babel-loader',
|
||||||
|
options: {
|
||||||
|
presets: ['@babel/preset-env']
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
plugins: [
|
||||||
|
new CleanWebpackPlugin(['dist']),
|
||||||
|
new HtmlWebpackPlugin({
|
||||||
|
title: 'tris-webpack-boilerplate',
|
||||||
|
filename: 'index.html',
|
||||||
|
template: './src/index.html',
|
||||||
|
inject: 'head'
|
||||||
|
}),
|
||||||
|
new PreloadWebpackPlugin({
|
||||||
|
rel: 'preload',
|
||||||
|
as(entry) {
|
||||||
|
if (/\.(woff|woff2|ttf|otf)$/.test(entry)) return 'font';
|
||||||
|
},
|
||||||
|
fileWhitelist: [/\.(woff|woff2|ttf|otf)$/],
|
||||||
|
include: 'allAssets'
|
||||||
|
}),
|
||||||
|
new ScriptExtHtmlWebpackPlugin({
|
||||||
|
defaultAttribute: 'defer'
|
||||||
|
}),
|
||||||
|
new MiniCssExtractPlugin({
|
||||||
|
filename: 'webpack-bundle.css',
|
||||||
|
chunkFilename: '[id].css'
|
||||||
|
})
|
||||||
|
],
|
||||||
|
externals: {
|
||||||
|
$: 'jquery',
|
||||||
|
jquery: 'jQuery',
|
||||||
|
'window.$': 'jquery',
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
filename: 'webpack-bundle.js',
|
||||||
|
path: path.resolve(__dirname, 'dist')
|
||||||
|
}
|
||||||
|
};
|
|
@ -0,0 +1,7 @@
|
||||||
|
const merge = require('webpack-merge');
|
||||||
|
const common = require('./webpack.common.js');
|
||||||
|
|
||||||
|
module.exports = merge(common, {
|
||||||
|
mode: 'development',
|
||||||
|
devtool: 'inline-source-map'
|
||||||
|
});
|
|
@ -0,0 +1,43 @@
|
||||||
|
const merge = require('webpack-merge');
|
||||||
|
const common = require('./webpack.common.js');
|
||||||
|
|
||||||
|
const TerserPlugin = require('terser-webpack-plugin');
|
||||||
|
const ImageminPlugin = require('imagemin-webpack-plugin').default;
|
||||||
|
const imageminMozjpeg = require('imagemin-mozjpeg');
|
||||||
|
const CompressionPlugin = require('compression-webpack-plugin');
|
||||||
|
|
||||||
|
const FaviconsWebpackPlugin = require('favicons-webpack-plugin');
|
||||||
|
const OfflinePlugin = require('offline-plugin');
|
||||||
|
|
||||||
|
|
||||||
|
module.exports = merge(common, {
|
||||||
|
mode: 'production',
|
||||||
|
devtool: 'source-map',
|
||||||
|
optimization: {
|
||||||
|
minimizer: [
|
||||||
|
new TerserPlugin({
|
||||||
|
test: /\.js(\?.*)?$/i,
|
||||||
|
parallel: true,
|
||||||
|
sourceMap: true,
|
||||||
|
})
|
||||||
|
]
|
||||||
|
},
|
||||||
|
plugins: [
|
||||||
|
new CompressionPlugin({
|
||||||
|
test: /\.(html|css|js)(\?.*)?$/i // only compressed html/css/js, skips compressing sourcemaps etc
|
||||||
|
}),
|
||||||
|
new ImageminPlugin({
|
||||||
|
test: /\.(jpe?g|png|gif|svg)$/i,
|
||||||
|
gifsicle: { // lossless gif compressor
|
||||||
|
optimizationLevel: 9
|
||||||
|
},
|
||||||
|
pngquant: ({ // lossy png compressor, remove for default lossless
|
||||||
|
quality: '75'
|
||||||
|
}),
|
||||||
|
plugins: [imageminMozjpeg({ // lossy jpg compressor, remove for default lossless
|
||||||
|
quality: '75'
|
||||||
|
})]
|
||||||
|
}),
|
||||||
|
new OfflinePlugin()
|
||||||
|
]
|
||||||
|
});
|
Loading…
Reference in New Issue