├── .gitignore ├── .prettierignore ├── .prettierrc.json ├── README.md ├── app.mjs ├── app ├── animations │ └── Paragraph.js ├── classes │ ├── Animation.js │ ├── Component.js │ └── Page.js ├── components │ ├── Preloader.js │ └── Transition.js ├── index.js ├── pages │ ├── About │ │ └── index.js │ ├── Contact │ │ └── index.js │ ├── Home │ │ └── index.js │ ├── Portfolio │ │ └── index.js │ └── Work │ │ └── index.js ├── service-worker.js ├── utils │ ├── dom.js │ ├── locoscroll.js │ ├── math.js │ ├── polyfill.js │ ├── scroll.js │ ├── sw.js │ └── text.js └── vendors │ └── magnet.js ├── fonts ├── ampersand.woff └── ampersand.woff2 ├── offline └── index.html ├── package-lock.json ├── package.json ├── postcss.config.js ├── public ├── 1.jpg ├── about_1.jpg ├── about_2.jpg ├── about_3.jpg ├── about_banner.jpg ├── about_screen.jpg ├── android-chrome-192x192.png ├── android-chrome-512x512.png ├── apple-touch-icon.png ├── cases │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.webp │ ├── 4.jpg │ ├── 5.jpg │ ├── 6.jpg │ ├── 7.jpg │ └── 8.jpg ├── clients │ ├── 1.webp │ ├── 2.webp │ ├── 3.webp │ ├── 4.webp │ ├── 5.webp │ ├── 6.webp │ ├── 7.webp │ └── 8.webp ├── contact_banner.jpg ├── contact_screen.jpg ├── favicon-16x16.png ├── favicon-32x32.png ├── favicon.ico ├── home_screen.jpg ├── main.css ├── main.js ├── main.js.LICENSE.txt ├── offline │ └── index.html ├── service-worker.js ├── site.webmanifest └── team │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── 4.jpg │ ├── 5.jpg │ └── 6.jpg ├── shared ├── 1.jpg ├── about_1.jpg ├── about_2.jpg ├── about_3.jpg ├── about_banner.jpg ├── about_screen.jpg ├── android-chrome-192x192.png ├── android-chrome-512x512.png ├── apple-touch-icon.png ├── cases │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.webp │ ├── 4.jpg │ ├── 5.jpg │ ├── 6.jpg │ ├── 7.jpg │ └── 8.jpg ├── clients │ ├── 1.webp │ ├── 2.webp │ ├── 3.webp │ ├── 4.webp │ ├── 5.webp │ ├── 6.webp │ ├── 7.webp │ └── 8.webp ├── contact_banner.jpg ├── contact_screen.jpg ├── favicon-16x16.png ├── favicon-32x32.png ├── favicon.ico ├── home_screen.jpg ├── site.webmanifest └── team │ ├── 1.jpg │ ├── 2.jpg │ ├── 3.jpg │ ├── 4.jpg │ ├── 5.jpg │ └── 6.jpg ├── styles ├── base │ ├── base.scss │ ├── fonts.scss │ └── reset.scss ├── components │ ├── canvas.scss │ ├── footer.scss │ ├── navigation.scss │ └── preloader.scss ├── index.scss ├── pages │ ├── about │ │ └── about.scss │ ├── contact │ │ └── contact.scss │ ├── home │ │ └── home.scss │ ├── portfolio │ │ └── portfolio.scss │ └── work │ │ └── work.scss ├── shared │ ├── descriptions.scss │ ├── links.scss │ ├── section.scss │ └── titles.scss └── utils │ ├── functions.scss │ ├── mixins.scss │ ├── responsive.scss │ └── variables.scss ├── vercel.json ├── views ├── base.pug ├── pages │ ├── about.pug │ ├── contact.pug │ ├── home.pug │ ├── portfolio.pug │ └── works │ │ ├── emerald_planet.pug │ │ ├── olivia_arnold.pug │ │ ├── pierre.pug │ │ ├── rainbows.pug │ │ ├── shiny_diamond.pug │ │ ├── spirits_of_illusion.pug │ │ ├── the_secrets.pug │ │ ├── the_silks.pug │ │ └── work.pug └── partials │ ├── footer.pug │ ├── navigation.pug │ └── preloader.pug ├── webpack.config.build.js ├── webpack.config.development.js └── webpack.config.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | log/ 3 | npm-debug.log 4 | 5 | .env 6 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | *.pug 2 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "arrowParens": "always", 3 | "bracketSpacing": true, 4 | "bracketSameLine": false, 5 | "singleQuote": false, 6 | "printWidth": 80, 7 | "trailingComma": "none" 8 | } 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # awwward-rebuild-SOTD--1 2 | 3 | [![JS Standard Style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat-square)](http://standardjs.com/) 4 | 5 | ![Screenshot of Website](banner.png) 6 | 7 | # Getting Started 8 | 9 | You need to have [Node.js](https://nodejs.org/en/) and [npm](https://www.npmjs.com/) installed in your machine, these are our only dependencies to run the project locally. 10 | 11 | ```sh 12 | # Clone the project. 13 | git clone https://github.com/MAGGIx1404/awwward-rebuild-SOTD--1.git 14 | 15 | # Install npm depedencies. 16 | npm install 17 | 18 | # Configure .env variables and run the website. 19 | npm run dev 20 | ``` 21 | -------------------------------------------------------------------------------- /app.mjs: -------------------------------------------------------------------------------- 1 | import express from "express"; 2 | import methodOverride from "method-override"; 3 | import compression from "compression"; 4 | import errorHandler from "errorhandler"; 5 | import path from "path"; 6 | import morgan from "morgan"; 7 | 8 | const __dirname = path.resolve(); 9 | const port = process.env.PORT || 9000; 10 | const app = express(); 11 | 12 | // Express configs 13 | app.set("views", path.join(__dirname, "views")); 14 | app.set("view engine", "pug"); 15 | 16 | // Middlewares 17 | app.use( 18 | compression({ 19 | level: 9 20 | }) 21 | ); 22 | app.use(methodOverride()); 23 | app.use(errorHandler()); 24 | app.use(express.static(path.join(__dirname, "public"))); 25 | app.use(morgan("dev")); 26 | 27 | // Home page 28 | app.get("/", (req, res) => { 29 | res.render("pages/home", { 30 | title: "Home" 31 | }); 32 | }); 33 | 34 | // About page 35 | app.get("/about", (req, res) => { 36 | res.render("pages/about", { 37 | title: "About" 38 | }); 39 | }); 40 | 41 | // Portfolio page 42 | app.get("/portfolio", (req, res) => { 43 | return res.render("pages/portfolio", { 44 | title: "Portfolio" 45 | }); 46 | }); 47 | 48 | // Contact page 49 | app.get("/contact", (req, res) => { 50 | return res.render("pages/contact", { 51 | title: "Contact" 52 | }); 53 | }); 54 | 55 | // works page 56 | app.get("/works/:name", (req, res) => { 57 | const name = req.params.name; 58 | res.render(`pages/works/${name}`, { 59 | title: `${name}` 60 | }); 61 | }); 62 | 63 | app.listen(port, () => { 64 | console.log(`Server started at ${port}`); 65 | }); 66 | -------------------------------------------------------------------------------- /app/animations/Paragraph.js: -------------------------------------------------------------------------------- 1 | import each from "lodash/each"; 2 | import Animation from "classes/Animation"; 3 | import { calculate, split } from "utils/text"; 4 | 5 | export default class extends Animation { 6 | constructor({ element }) { 7 | const lines = []; 8 | const paragraphs = element.querySelectorAll("h1, h2, p"); 9 | 10 | if (paragraphs.length !== 0) { 11 | each(paragraphs, (element) => { 12 | split({ element }); 13 | split({ element }); 14 | 15 | lines.push(...element.querySelectorAll("span span")); 16 | }); 17 | } else { 18 | split({ element }); 19 | split({ element }); 20 | 21 | lines.push(...element.querySelectorAll("span span")); 22 | } 23 | 24 | super({ 25 | element, 26 | elements: { 27 | lines 28 | } 29 | }); 30 | 31 | this.onResize(); 32 | 33 | if ("IntersectionObserver" in window) { 34 | this.animateOut(); 35 | } 36 | } 37 | 38 | animateIn() { 39 | super.animateIn(); 40 | 41 | each(this.lines, (line, lineIndex) => { 42 | each(line, (word) => { 43 | word.style.transition = `transform 1.45s ${ 44 | lineIndex * 0.1 45 | }s cubic-bezier(0.77, 0, 0.175, 1)`; 46 | word.style[this.transformPrefix] = "translateY(0)"; 47 | }); 48 | }); 49 | } 50 | 51 | animateOut() { 52 | super.animateOut(); 53 | 54 | each(this.lines, (line) => { 55 | each(line, (word) => { 56 | word.style[this.transformPrefix] = "translateY(150%)"; 57 | }); 58 | }); 59 | } 60 | 61 | onResize() { 62 | this.lines = calculate(this.elements.lines); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /app/classes/Animation.js: -------------------------------------------------------------------------------- 1 | import AutoBind from "auto-bind"; 2 | import Prefix from "prefix"; 3 | 4 | export default class Animation { 5 | constructor({ element, elements }) { 6 | AutoBind(this); 7 | 8 | const { animationDelay, animationTarget } = element.dataset; 9 | 10 | this.delay = animationDelay; 11 | this.element = element; 12 | this.elements = elements; 13 | 14 | this.target = animationTarget ? element.closest(animationTarget) : element; 15 | this.transformPrefix = Prefix("transform"); 16 | 17 | this.isVisible = false; 18 | 19 | if ("IntersectionObserver" in window) { 20 | this.createObserver(); 21 | 22 | this.animateOut(); 23 | } else { 24 | this.animateIn(); 25 | } 26 | } 27 | 28 | createObserver() { 29 | this.observer = new window.IntersectionObserver( 30 | (entries, observer) => { 31 | entries.forEach((entry) => { 32 | if (!this.isVisible && entry.isIntersecting) { 33 | this.animateIn(); 34 | observer.unobserve(entry.target); 35 | } else { 36 | this.animateOut(); 37 | } 38 | }); 39 | }, 40 | { 41 | threshold: 0 42 | } 43 | ).observe(this.target); 44 | } 45 | 46 | animateIn() { 47 | this.isVisible = true; 48 | } 49 | 50 | animateOut() { 51 | this.isVisible = false; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /app/classes/Component.js: -------------------------------------------------------------------------------- 1 | import each from "lodash/each"; 2 | import EventEmitter from "events"; 3 | 4 | export default class Component extends EventEmitter { 5 | constructor({ element, elements }) { 6 | super(); 7 | this.selector = element; 8 | this.selectorChildrens = { ...elements }; 9 | this.element = null; 10 | this.elements = {}; 11 | 12 | this.create(); 13 | this.addEventListeners(); 14 | } 15 | 16 | create() { 17 | if (this.selector instanceof window.HTMLElement) { 18 | this.element = this.selector; 19 | } else { 20 | this.element = document.querySelector(this.selector); 21 | } 22 | 23 | this.elements = {}; 24 | 25 | each(this.selectorChildrens, (entry, key) => { 26 | if ( 27 | entry instanceof window.HTMLElement || 28 | entry instanceof window.NodeList || 29 | Array.isArray(entry) 30 | ) { 31 | this.elements[key] = entry; 32 | } else { 33 | this.elements[key] = this.element.querySelectorAll(entry); 34 | if (this.elements[key].length === 0) { 35 | this.elements[key] = null; 36 | } else if (this.elements[key].length === 1) { 37 | this.elements[key] = this.elements[key][0]; 38 | } 39 | } 40 | }); 41 | } 42 | 43 | addEventListeners() {} 44 | 45 | removeEventListeners() {} 46 | } 47 | -------------------------------------------------------------------------------- /app/classes/Page.js: -------------------------------------------------------------------------------- 1 | import "splitting/dist/splitting.css"; 2 | import "splitting/dist/splitting-cells.css"; 3 | import Splitting from "splitting"; 4 | import each from "lodash/each"; 5 | import Prefix from "prefix"; 6 | import gsap from "gsap"; 7 | import { mapEach } from "utils/dom"; 8 | import Paragraph from "animations/Paragraph"; 9 | import locoScroll from "utils/locoscroll"; 10 | 11 | export default class Page { 12 | constructor({ classes, id, element, elements }) { 13 | this.classes = { 14 | ...classes 15 | }; 16 | this.id = id; 17 | this.selector = element; 18 | this.selectorChildren = { 19 | animationsParagraphs: '[data-animation="paragraph"]', 20 | imagePreloaders: "[data-src]", 21 | overlayLines: ".overlay__line", 22 | 23 | ...elements 24 | }; 25 | this.element = element; 26 | this.elements = {}; 27 | this.transformPrefix = Prefix("transform"); 28 | this.animations = []; 29 | this.preloadersForImg = []; 30 | } 31 | 32 | /** 33 | * Select Elements from DOM and init necessery things 34 | */ 35 | create() { 36 | this.element = document.querySelector(this.selector); 37 | this.elements = {}; 38 | 39 | each(this.selectorChildren, (entry, key) => { 40 | if ( 41 | entry instanceof window.HTMLElement || 42 | entry instanceof window.NodeList || 43 | Array.isArray(entry) 44 | ) { 45 | this.elements[key] = entry; 46 | } else { 47 | this.elements[key] = this.element.querySelectorAll(entry); 48 | if (this.elements[key].length === 0) { 49 | this.elements[key] = null; 50 | } else if (this.elements[key].length === 1) { 51 | this.elements[key] = this.elements[key][0]; 52 | } 53 | } 54 | }); 55 | 56 | this.createAnimations(); 57 | this.initLocoScroll(); 58 | this.locoScroll.update(); 59 | this.text(); 60 | } 61 | 62 | text() { 63 | const target = document.querySelectorAll(".splitter"); 64 | const result = Splitting({ 65 | target: target 66 | }); 67 | } 68 | 69 | /** 70 | * Common Animation on all pages 71 | */ 72 | createAnimations() { 73 | /** 74 | * Paragraphs. 75 | */ 76 | this.animationsParagraphs = mapEach( 77 | this.elements.animationsParagraphs, 78 | (element) => { 79 | return new Paragraph({ element }); 80 | } 81 | ); 82 | 83 | this.animations.push(...this.animationsParagraphs); 84 | } 85 | 86 | /** 87 | * Init Locomotive scroll 88 | */ 89 | initLocoScroll() { 90 | this.locoScroll = locoScroll(this.elements.wrapper); 91 | } 92 | 93 | /** 94 | * Page Show Transition 95 | */ 96 | async show(onPreloaded = false) { 97 | if (onPreloaded) { 98 | return new Promise((resolve) => { 99 | this.animationIn = gsap.timeline(); 100 | this.animationIn.set(this.selectorChildren.overlayLines, { 101 | scaleX: 0, 102 | opacity: 0 103 | }); 104 | this.animationIn.call(() => { 105 | this.element.classList.add(this.classes.active); 106 | this.addEventListeners(); 107 | resolve(); 108 | }); 109 | }); 110 | } else { 111 | return new Promise((resolve) => { 112 | this.animationIn = gsap.timeline(); 113 | this.animationIn.set(this.selectorChildren.overlayLines, { 114 | transformOrigin: "right" 115 | }); 116 | this.animationIn.to(this.selectorChildren.overlayLines, 0.4, { 117 | scaleX: 0, 118 | opacity: 1, 119 | stagger: 0.1, 120 | ease: "Power2.easeIn" 121 | }); 122 | this.animationIn.call(() => { 123 | this.element.classList.add(this.classes.active); 124 | this.addEventListeners(); 125 | this.onResize(); 126 | resolve(); 127 | }); 128 | }); 129 | } 130 | } 131 | 132 | /** 133 | * Page Hide Transition 134 | */ 135 | async hide() { 136 | return new Promise((resolve) => { 137 | each(this.animations, (animation) => { 138 | animation.animateOut(); 139 | }); 140 | this.element.classList.remove(this.classes.active); 141 | 142 | this.destroy(); 143 | window.ASSETS = []; 144 | this.animateOut = gsap.timeline(); 145 | this.animateOut.set(this.selectorChildren.overlayLines, { 146 | transformOrigin: "left", 147 | scaleX: 0, 148 | opacity: 1 149 | }); 150 | this.animateOut.to(this.selectorChildren.overlayLines, 0.4, { 151 | scaleX: 1, 152 | opacity: 1, 153 | stagger: 0.1, 154 | ease: "Power2.easeOut" 155 | }); 156 | this.animateOut.call(() => { 157 | resolve(); 158 | }); 159 | }); 160 | } 161 | 162 | /** 163 | * Update function for request animation frame 164 | */ 165 | update() {} 166 | 167 | /** 168 | * On Resize event Handler 169 | */ 170 | onResize() { 171 | if (this.elements.wrapper) { 172 | this.locoScroll.update(); 173 | } 174 | 175 | this.animations.forEach((animation) => { 176 | animation.onResize(); 177 | }); 178 | } 179 | 180 | /** 181 | * Create and Register common event listeners 182 | */ 183 | addEventListeners() {} 184 | 185 | /** 186 | * Remove event listeners. Call on Page Hide 187 | */ 188 | removeEventListeners() {} 189 | 190 | /** 191 | * Alias of removeEventListener 192 | */ 193 | destroy() { 194 | this.removeEventListeners(); 195 | if (this.elements.wrapper) { 196 | this.locoScroll.destroy(); 197 | } 198 | } 199 | } 200 | -------------------------------------------------------------------------------- /app/components/Preloader.js: -------------------------------------------------------------------------------- 1 | import Component from "classes/Component"; 2 | import each from "lodash/each"; 3 | import gsap from "gsap"; 4 | import { split } from "utils/text"; 5 | 6 | export default class Preloader extends Component { 7 | constructor() { 8 | super({ 9 | element: ".preloader", 10 | elements: { 11 | title: ".preloader__text", 12 | number: ".preloader__number", 13 | images: document.querySelectorAll("img"), 14 | numberText: ".preloader__number__text", 15 | preloader_line: ".preloader__line", 16 | preloader_span: ".preloader__text__span" 17 | } 18 | }); 19 | 20 | this.length = 0; 21 | this.createLoader(); 22 | } 23 | 24 | createLoader() { 25 | each(this.elements.images, (element) => { 26 | element.src = element.getAttribute("data-src"); 27 | element.onload = () => { 28 | element.classList.add("loaded"); 29 | this.onAssetLoaded(); 30 | }; 31 | }); 32 | } 33 | 34 | onAssetLoaded() { 35 | this.length += 1; 36 | const percent = this.length / this.elements.images.length; 37 | 38 | this.elements.numberText.innerHTML = `${Math.round(percent * 100)}%`; 39 | 40 | if (percent === 1) { 41 | this.onLoaded(); 42 | } 43 | } 44 | 45 | onLoaded() { 46 | return new Promise((resolve) => { 47 | this.animateOut = gsap.timeline({ 48 | delay: 1 49 | }); 50 | this.animateOut.to(this.elements.numberText, { 51 | y: "100%", 52 | stagger: "0.1", 53 | duration: 1.5, 54 | ease: "expo.out" 55 | }); 56 | this.animateOut.to( 57 | this.elements.preloader_span, 58 | 1, 59 | { 60 | y: "0", 61 | stagger: 0.1, 62 | ease: "Power2.easeIn" 63 | }, 64 | "-=1.5" 65 | ); 66 | this.animateOut.to(this.elements.preloader_span, 1, { 67 | x: "200%", 68 | stagger: 0.1, 69 | ease: "Power2.easeIn" 70 | }); 71 | this.animateOut.to( 72 | this.elements.preloader_line, 73 | 1, 74 | { 75 | y: "100%", 76 | opacity: 1, 77 | stagger: 0.1, 78 | ease: "Power2.easeIn" 79 | }, 80 | "-=1" 81 | ); 82 | this.animateOut.to(this.element, { 83 | opacity: 0, 84 | duration: 1, 85 | ease: "expo.out" 86 | }); 87 | 88 | this.animateOut.call(() => { 89 | this.emit("completed"); 90 | }); 91 | }); 92 | } 93 | 94 | destroy() { 95 | this.element.parentNode.removeChild(this.element); 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /app/components/Transition.js: -------------------------------------------------------------------------------- 1 | import GSAP from "gsap"; 2 | 3 | export default class { 4 | constructor() { 5 | this.element = document.createElement("canvas"); 6 | this.element.className = "transition"; 7 | this.element.height = window.innerHeight * window.devicePixelRatio; 8 | this.element.width = window.innerWidth * window.devicePixelRatio; 9 | 10 | this.context = this.element.getContext("2d"); 11 | 12 | this.progress = 0; 13 | 14 | document.body.appendChild(this.element); 15 | } 16 | 17 | show({ color }) { 18 | this.color = color; 19 | 20 | return new Promise((resolve) => { 21 | GSAP.set(this.element, { rotation: 0 }); 22 | 23 | GSAP.to(this, { 24 | duration: 1.5, 25 | ease: "expo.inOut", 26 | onComplete: resolve, 27 | onUpdate: this.onUpdate.bind(this), 28 | progress: 1 29 | }); 30 | }); 31 | } 32 | 33 | hide() { 34 | return new Promise((resolve) => { 35 | GSAP.set(this.element, { rotation: 180 }); 36 | 37 | GSAP.to(this, { 38 | duration: 1.5, 39 | ease: "expo.inOut", 40 | onComplete: resolve, 41 | onUpdate: this.onUpdate.bind(this), 42 | progress: 0 43 | }); 44 | }); 45 | } 46 | 47 | onUpdate() { 48 | this.context.clearRect(0, 0, this.element.width, this.element.height); 49 | this.context.save(); 50 | this.context.beginPath(); 51 | 52 | this.widthSegments = Math.ceil(this.element.width / 40); 53 | this.context.moveTo(this.element.width, this.element.height); 54 | this.context.lineTo(0, this.element.height); 55 | 56 | const t = (1 - this.progress) * this.element.height; 57 | const amplitude = 250 * Math.sin(this.progress * Math.PI); 58 | 59 | this.context.lineTo(0, t); 60 | 61 | for (let index = 0; index <= this.widthSegments; index++) { 62 | const n = 40 * index; 63 | const r = t - Math.sin((n / this.element.width) * Math.PI) * amplitude; 64 | 65 | this.context.lineTo(n, r); 66 | } 67 | 68 | this.context.fillStyle = this.color; 69 | this.context.fill(); 70 | this.context.restore(); 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /app/index.js: -------------------------------------------------------------------------------- 1 | import "utils/scroll"; 2 | import "utils/polyfill"; 3 | import "utils/sw"; 4 | 5 | import Home from "pages/Home"; 6 | import About from "pages/About"; 7 | import Portfolio from "pages/Portfolio"; 8 | import Contact from "pages/Contact"; 9 | import Work from "pages/Work"; 10 | import Preloader from "components/Preloader"; 11 | import each from "lodash/each"; 12 | import magnetBtn from "vendors/magnet"; 13 | 14 | class App { 15 | constructor() { 16 | console.log("🦸🦸 Superman Initialize"); 17 | this.preloader = null; 18 | this.content = null; 19 | this.template = null; 20 | this.pages = {}; 21 | this.page = null; 22 | this.navigation = null; 23 | this.handleUpdate = this.update.bind(this); 24 | this.handleOnResize = this.onResize.bind(this); 25 | this.handleOnPopState = this.handleOnPopState.bind(this); 26 | 27 | this.createContent(); 28 | this.createPreloader(); 29 | this.createTransition(); 30 | this.createPages(); 31 | magnetBtn(); 32 | this.hambMenu(); 33 | this.addLinkListeners(); 34 | this.addEventListeners(); 35 | this.update(); 36 | } 37 | 38 | /** 39 | * Set Page template 40 | */ 41 | createContent() { 42 | this.content = document.querySelector(".content"); 43 | this.template = this.content.getAttribute("data-template"); 44 | } 45 | 46 | /** 47 | * Create Preloader 48 | */ 49 | createPreloader() { 50 | this.preloader = new Preloader(); 51 | this.preloader.once("completed", () => this.onPreloaded()); 52 | } 53 | 54 | /** 55 | * Create Transition 56 | */ 57 | createTransition() { 58 | // this.transition = new Transition(); 59 | } 60 | 61 | /** 62 | * Mount Page 63 | */ 64 | createPages() { 65 | this.pages = { 66 | home: new Home(), 67 | about: new About(), 68 | portfolio: new Portfolio(), 69 | contact: new Contact(), 70 | work: new Work() 71 | }; 72 | 73 | this.page = this.pages[this.template]; 74 | this.page.create(); 75 | } 76 | 77 | /** 78 | * Request Animation frame 79 | */ 80 | 81 | update() { 82 | if (this.page && this.page.update) { 83 | this.page.update(); 84 | } 85 | 86 | this.frame = window.requestAnimationFrame(this.handleUpdate); 87 | } 88 | 89 | /** 90 | * Event Handlers 91 | */ 92 | 93 | onPreloaded() { 94 | this.preloader.destroy(); 95 | this.onResize(); 96 | this.page.show(true); 97 | } 98 | 99 | onResize() { 100 | if (this.page && this.page.onResize) { 101 | this.page.onResize(); 102 | } 103 | } 104 | 105 | async onChange({ url, push = true }) { 106 | if (url === window.location.href) return; 107 | 108 | await this.page.hide(); 109 | const res = await window.fetch(url); 110 | if (res.status === 200) { 111 | const html = await res.text(); 112 | const fakeDiv = document.createElement("div"); 113 | 114 | if (push) { 115 | window.history.pushState({}, "", url); 116 | } 117 | 118 | fakeDiv.innerHTML = html; 119 | 120 | const divContent = fakeDiv.querySelector(".content"); 121 | this.template = divContent.getAttribute("data-template"); 122 | this.content.setAttribute( 123 | "data-template", 124 | divContent.getAttribute("data-template") 125 | ); 126 | this.content.innerHTML = divContent.innerHTML; 127 | this.page = this.pages[this.template]; 128 | 129 | this.preloadingOnPageTransition(); 130 | } 131 | } 132 | 133 | preloadingOnPageTransition() { 134 | const imgs = this.content.querySelectorAll("img"); 135 | let percent = 0, 136 | loadedImgs = 0; 137 | imgs.forEach((img) => { 138 | img.src = img.getAttribute("data-src"); 139 | img.onload = () => { 140 | loadedImgs++; 141 | img.classList.add("loaded"); 142 | percent = loadedImgs / imgs.length; 143 | 144 | if (percent === 1) { 145 | this.page.create(); 146 | this.onResize(); 147 | this.addLinkListeners(); 148 | this.page.show(); 149 | } 150 | }; 151 | }); 152 | } 153 | 154 | handleOnPopState() { 155 | this.onChange({ 156 | url: window.location.pathname, 157 | push: false 158 | }); 159 | } 160 | 161 | /** 162 | * Add page transition on each "a" element 163 | */ 164 | addLinkListeners() { 165 | const links = document.querySelectorAll( 166 | "a:not(.footer__content__cr__link)" 167 | ); 168 | each(links, (link) => { 169 | link.onclick = (e) => { 170 | e.preventDefault(); 171 | const { href } = link; 172 | this.onChange({ url: href }); 173 | }; 174 | }); 175 | } 176 | 177 | /** 178 | * Add Event Listeners 179 | */ 180 | addEventListeners() { 181 | window.addEventListener("resize", this.handleOnResize); 182 | window.addEventListener("popstate", this.handleOnPopState); 183 | } 184 | 185 | // hamb menu 186 | 187 | hambMenu() { 188 | let hamb__btn = document.querySelector(".hamb__btn"); 189 | let hamb__menu = document.querySelector(".hamb__menu"); 190 | let hamb__links = [...document.querySelectorAll(".hamb__menu__link")]; 191 | 192 | hamb__btn.addEventListener("click", function () { 193 | hamb__menu.classList.toggle("active"); 194 | }); 195 | 196 | hamb__links.forEach((el) => { 197 | el.addEventListener("click", function () { 198 | hamb__menu.classList.remove("active"); 199 | }); 200 | }); 201 | } 202 | } 203 | 204 | const app = new App(); 205 | -------------------------------------------------------------------------------- /app/pages/About/index.js: -------------------------------------------------------------------------------- 1 | import Page from "classes/Page"; 2 | import gsap from "gsap"; 3 | import Ukiyo from "ukiyojs"; 4 | 5 | export default class About extends Page { 6 | constructor() { 7 | super({ 8 | classes: { 9 | active: "about--active" 10 | }, 11 | id: "about", 12 | element: ".about", 13 | elements: { 14 | wrapper: ".about__wrapper", // scroller 15 | about_pics: ".parallax__image", 16 | // sliders 17 | menu: ".about__team__menu", 18 | items: ".menu__item", 19 | images: ".menu__item__pic" 20 | } 21 | }); 22 | } 23 | 24 | create() { 25 | super.create(); 26 | this.parallax(); 27 | this.slider(); 28 | } 29 | 30 | parallax() { 31 | this.imgOne = [...this.elements.about_pics]; 32 | this.imgOne.forEach((ele) => { 33 | this.parallaxEffect = new Ukiyo(ele, { 34 | speed: 2, 35 | scale: 1.4 36 | }); 37 | }); 38 | } 39 | 40 | onResize() { 41 | super.onResize(); 42 | } 43 | 44 | // team slider 45 | slider() { 46 | let menuWidth = this.elements.menu.clientWidth; 47 | let itemWidth = this.elements.items[0].clientWidth; 48 | let wrapWidth = this.elements.items.length * itemWidth; 49 | 50 | let scrollSpeed = 0; 51 | let oldScrollY = 0; 52 | let scrollY = 0; 53 | let y = 0; 54 | 55 | const lerp = (v0, v1, t) => { 56 | return v0 * (1 - t) + v1 * t; 57 | }; 58 | 59 | const dispose = (scroll) => { 60 | gsap.set(this.elements.items, { 61 | x: (i) => { 62 | return i * itemWidth + scroll; 63 | }, 64 | modifiers: { 65 | x: (x, target) => { 66 | const s = gsap.utils.wrap( 67 | -itemWidth, 68 | wrapWidth - itemWidth, 69 | parseInt(x) 70 | ); 71 | return `${s}px`; 72 | } 73 | } 74 | }); 75 | }; 76 | dispose(0); 77 | 78 | const handleMouseWheel = (e) => { 79 | scrollY -= e.deltaY * 0.9; 80 | }; 81 | 82 | let touchStart = 0; 83 | let touchX = 0; 84 | let isDragging = false; 85 | const handleTouchStart = (e) => { 86 | touchStart = e.clientX || e.touches[0].clientX; 87 | isDragging = true; 88 | this.elements.menu.classList.add("is-dragging"); 89 | }; 90 | const handleTouchMove = (e) => { 91 | if (!isDragging) return; 92 | touchX = e.clientX || e.touches[0].clientX; 93 | scrollY += (touchX - touchStart) * 2.5; 94 | touchStart = touchX; 95 | }; 96 | const handleTouchEnd = () => { 97 | isDragging = false; 98 | this.elements.menu.classList.remove("is-dragging"); 99 | }; 100 | 101 | this.elements.menu.addEventListener("mousewheel", handleMouseWheel); 102 | 103 | this.elements.menu.addEventListener("touchstart", handleTouchStart); 104 | this.elements.menu.addEventListener("touchmove", handleTouchMove); 105 | this.elements.menu.addEventListener("touchend", handleTouchEnd); 106 | 107 | this.elements.menu.addEventListener("mousedown", handleTouchStart); 108 | this.elements.menu.addEventListener("mousemove", handleTouchMove); 109 | this.elements.menu.addEventListener("mouseleave", handleTouchEnd); 110 | this.elements.menu.addEventListener("mouseup", handleTouchEnd); 111 | 112 | this.elements.menu.addEventListener("selectstart", () => { 113 | return false; 114 | }); 115 | 116 | window.addEventListener("resize", () => { 117 | menuWidth = this.elements.menu.clientWidth; 118 | itemWidth = this.elements.items[0].clientWidth; 119 | wrapWidth = this.elements.items.length * itemWidth; 120 | }); 121 | 122 | const render = () => { 123 | requestAnimationFrame(render); 124 | y = lerp(y, scrollY, 0.1); 125 | dispose(y); 126 | 127 | scrollSpeed = y - oldScrollY; 128 | oldScrollY = y; 129 | 130 | gsap.to(this.elements.items, { 131 | skewX: -scrollSpeed * 0.2, 132 | rotate: scrollSpeed * 0.01 133 | // scale: 1 - Math.min(100, Math.abs(scrollSpeed)) * 0.003 134 | }); 135 | }; 136 | render(); 137 | } 138 | } 139 | -------------------------------------------------------------------------------- /app/pages/Contact/index.js: -------------------------------------------------------------------------------- 1 | import Page from "classes/Page"; 2 | import Ukiyo from "ukiyojs"; 3 | 4 | export default class Contact extends Page { 5 | constructor() { 6 | super({ 7 | classes: { 8 | active: "contact--active" 9 | }, 10 | id: "contact", 11 | element: ".contact", 12 | elements: { 13 | wrapper: ".contact__wrapper", // scroller 14 | contact_pics: ".parallax__image" 15 | } 16 | }); 17 | } 18 | 19 | create() { 20 | super.create(); 21 | this.parallax(); 22 | } 23 | 24 | parallax() { 25 | this.imgOne = [...this.elements.contact_pics]; 26 | this.imgOne.forEach((el) => { 27 | this.parallaxEffect = new Ukiyo(el, { 28 | speed: 2.5, 29 | scale: 1.25 30 | }); 31 | }); 32 | } 33 | 34 | onResize() { 35 | super.onResize(); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/pages/Home/index.js: -------------------------------------------------------------------------------- 1 | import Page from "classes/Page"; 2 | import Ukiyo from "ukiyojs"; 3 | 4 | export default class Home extends Page { 5 | constructor() { 6 | super({ 7 | classes: { 8 | active: "home--active" 9 | }, 10 | id: "home", 11 | element: ".home", 12 | elements: { 13 | wrapper: ".home__wrapper", // scroller 14 | links_wrapper: ".home__title__link", 15 | home_pics: ".parallax__image" 16 | } 17 | }); 18 | } 19 | 20 | create() { 21 | super.create(); 22 | this.parallax(); 23 | } 24 | 25 | parallax() { 26 | this.imgOne = [...this.elements.home_pics]; 27 | 28 | this.imgOne.forEach((ele) => { 29 | this.parallaxEffect = new Ukiyo(ele, { 30 | speed: 2.5, 31 | scale: 1.25 32 | }); 33 | }); 34 | } 35 | 36 | onResize() { 37 | super.onResize(); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/pages/Portfolio/index.js: -------------------------------------------------------------------------------- 1 | import Page from "classes/Page"; 2 | import gsap from "gsap"; 3 | 4 | export default class Portfolio extends Page { 5 | constructor() { 6 | super({ 7 | classes: { 8 | active: "portfolio--active" 9 | }, 10 | id: "portfolio", 11 | element: ".portfolio", 12 | elements: { 13 | wrapper: ".portfolio__wrapper", // scroller 14 | links_wrapper: ".portfolio__title__link", 15 | menu: ".portfolio__menu", 16 | items: ".portfolio__menu__item" 17 | } 18 | }); 19 | } 20 | 21 | create() { 22 | super.create(); 23 | this.infiniteList(); 24 | } 25 | 26 | infiniteList() { 27 | let menuHeight = this.elements.menu.clientHeight; 28 | let itemHeight = this.elements.items[0].clientHeight; 29 | let wrapHeight = this.elements.items.length * itemHeight; 30 | 31 | let scrollSpeed = 0; 32 | let oldScrollY = 0; 33 | let scrollY = 0; 34 | let y = 0; 35 | 36 | const lerp = (v0, v1, t) => { 37 | return v0 * (1 - t) + v1 * t; 38 | }; 39 | 40 | const dispose = (scroll) => { 41 | gsap.set(this.elements.items, { 42 | y: (i) => { 43 | return i * itemHeight + scroll; 44 | }, 45 | modifiers: { 46 | y: (y) => { 47 | const s = gsap.utils.wrap( 48 | -itemHeight, 49 | wrapHeight - itemHeight, 50 | parseInt(y) 51 | ); 52 | return `${s}px`; 53 | } 54 | } 55 | }); 56 | }; 57 | dispose(0); 58 | 59 | const handleMouseWheel = (e) => { 60 | scrollY -= e.deltaY * 3; 61 | }; 62 | 63 | let touchStart = 0; 64 | let touchY = 0; 65 | let isDragging = false; 66 | const handleTouchStart = (e) => { 67 | touchStart = e.clientY || e.touches[0].clientY; 68 | isDragging = true; 69 | this.elements.menu.classList.add("is-dragging"); 70 | }; 71 | const handleTouchMove = (e) => { 72 | if (!isDragging) return; 73 | touchY = e.clientY || e.touches[0].clientY; 74 | scrollY += (touchY - touchStart) * 10; 75 | touchStart = touchY; 76 | }; 77 | const handleTouchEnd = () => { 78 | isDragging = false; 79 | this.elements.menu.classList.remove("is-dragging"); 80 | }; 81 | 82 | this.elements.menu.addEventListener("mousewheel", handleMouseWheel); 83 | 84 | this.elements.menu.addEventListener("touchstart", handleTouchStart); 85 | this.elements.menu.addEventListener("touchmove", handleTouchMove); 86 | this.elements.menu.addEventListener("touchend", handleTouchEnd); 87 | 88 | this.elements.menu.addEventListener("mousedown", handleTouchStart); 89 | this.elements.menu.addEventListener("mousemove", handleTouchMove); 90 | this.elements.menu.addEventListener("mouseleave", handleTouchEnd); 91 | this.elements.menu.addEventListener("mouseup", handleTouchEnd); 92 | 93 | this.elements.menu.addEventListener("selectstart", () => { 94 | return false; 95 | }); 96 | 97 | window.addEventListener("resize", () => { 98 | menuHeight = this.elements.menu.clientHeight; 99 | itemHeight = this.elements.items[0].clientHeight; 100 | wrapHeight = this.elements.items.length * itemHeight; 101 | }); 102 | 103 | const render = () => { 104 | requestAnimationFrame(render); 105 | y = lerp(y, scrollY, 0.04); 106 | dispose(y); 107 | 108 | scrollSpeed = y - oldScrollY; 109 | oldScrollY = y; 110 | 111 | gsap.to(this.elements.items, { 112 | skewX: -scrollSpeed * 0.2 113 | }); 114 | }; 115 | render(); 116 | } 117 | 118 | onResize() { 119 | super.onResize(); 120 | } 121 | } 122 | -------------------------------------------------------------------------------- /app/pages/Work/index.js: -------------------------------------------------------------------------------- 1 | import Page from "classes/Page"; 2 | import Ukiyo from "ukiyojs"; 3 | 4 | export default class Work extends Page { 5 | constructor() { 6 | super({ 7 | classes: { 8 | active: "work--active" 9 | }, 10 | id: "work", 11 | element: ".work", 12 | elements: { 13 | wrapper: ".work__wrapper", // scroller 14 | home_pics: ".parallax__image" 15 | } 16 | }); 17 | } 18 | 19 | create() { 20 | super.create(); 21 | this.parallax(); 22 | } 23 | 24 | parallax() { 25 | this.imgOne = [...this.elements.home_pics]; 26 | 27 | this.imgOne.forEach((ele) => { 28 | this.parallaxEffect = new Ukiyo(ele, { 29 | speed: 1.5, 30 | scale: 1.5 31 | }); 32 | }); 33 | } 34 | 35 | onResize() { 36 | super.onResize(); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/service-worker.js: -------------------------------------------------------------------------------- 1 | const staticCacheName = "jeet-static-v1"; 2 | 3 | const filesToCache = ["/offline/index.html"]; 4 | 5 | this.addEventListener("install", (event) => { 6 | this.skipWaiting(); 7 | 8 | event.waitUntil( 9 | caches.open(staticCacheName).then((cache) => { 10 | return cache.addAll(filesToCache); 11 | }) 12 | ); 13 | }); 14 | 15 | // Serve from Cache 16 | this.addEventListener("fetch", (event) => { 17 | event.respondWith( 18 | caches 19 | .match(event.request) 20 | .then((response) => { 21 | return response || fetch(event.request); 22 | }) 23 | .catch(() => { 24 | return caches.match("/offline/index.html"); 25 | }) 26 | ); 27 | }); 28 | -------------------------------------------------------------------------------- /app/utils/dom.js: -------------------------------------------------------------------------------- 1 | import map from "lodash/map"; 2 | 3 | export const findAncestor = (element, selector) => { 4 | while ( 5 | (element = element.parentElement) && 6 | !(element.matches || element.matchesSelector).call(element, selector) 7 | ) { 8 | return element; 9 | } 10 | }; 11 | 12 | export const getOffset = (element, scroll = 0) => { 13 | const box = element.getBoundingClientRect(); 14 | 15 | return { 16 | bottom: box.bottom, 17 | height: box.height, 18 | left: box.left, 19 | top: box.top + scroll, 20 | width: box.width 21 | }; 22 | }; 23 | 24 | export function getIndex(node) { 25 | let index = 0; 26 | 27 | while ((node = node.previousElementSibling)) { 28 | index++; 29 | } 30 | 31 | return index; 32 | } 33 | 34 | export function mapEach(element, callback) { 35 | if (element instanceof window.HTMLElement) { 36 | return [callback(element)]; 37 | } 38 | 39 | return map(element, callback); 40 | } 41 | 42 | export const easing = `cubic-bezier(0.19, 1, 0.22, 1)`; 43 | -------------------------------------------------------------------------------- /app/utils/locoscroll.js: -------------------------------------------------------------------------------- 1 | import LocomotiveScroll from "locomotive-scroll"; 2 | import ScrollTrigger from "gsap/ScrollTrigger"; 3 | import gsap from "gsap"; 4 | gsap.registerPlugin(ScrollTrigger); 5 | 6 | export default function initLocoScroll(wrapper) { 7 | const locoScroll = new LocomotiveScroll({ 8 | el: wrapper, 9 | smooth: true, 10 | smoothMobile: true, 11 | lerp: 0.03, 12 | // reloadOncontextChange: true, 13 | getDirection: true, 14 | // repeat: true, 15 | mobile: { 16 | smooth: true, 17 | inertia: 0.8, 18 | breakpoint: 0, 19 | getDirection: true 20 | }, 21 | tablet: { 22 | smooth: true, 23 | inertia: 0.8, 24 | breakpoint: 0, 25 | getDirection: true 26 | } 27 | }); 28 | 29 | locoScroll.on("scroll", () => ScrollTrigger.update()); 30 | ScrollTrigger.scrollerProxy(wrapper, { 31 | scrollTop(value) { 32 | return arguments.length 33 | ? locoScroll.scrollTo(value, 0, 0) 34 | : locoScroll.scroll.instance.scroll.y; 35 | }, 36 | getBoundingClientRect() { 37 | return { 38 | top: 0, 39 | left: 0, 40 | width: window.innerWidth, 41 | height: window.innerHeight 42 | }; 43 | }, 44 | pinType: wrapper.style.transform ? "transform" : "fixed" 45 | }); 46 | 47 | return locoScroll; 48 | } 49 | -------------------------------------------------------------------------------- /app/utils/math.js: -------------------------------------------------------------------------------- 1 | import GSAP from "gsap"; 2 | 3 | export function lerp(p1, p2, t) { 4 | return GSAP.utils.interpolate(p1, p2, t); 5 | } 6 | 7 | export function clamp(min, max, number) { 8 | return GSAP.utils.clamp(min, max, number); 9 | } 10 | 11 | export function random(min, max) { 12 | return GSAP.utils.random(min, max); 13 | } 14 | 15 | export function map(valueToMap, inMin, inMax, outMin, outMax) { 16 | return GSAP.utils.mapRange(inMin, inMax, outMin, outMax, valueToMap); 17 | } 18 | 19 | export function delay(ms) { 20 | return new Promise((res) => GSAP.delayedCall(ms / 1000, res)); 21 | } 22 | -------------------------------------------------------------------------------- /app/utils/polyfill.js: -------------------------------------------------------------------------------- 1 | import "nodelist-foreach-polyfill"; 2 | -------------------------------------------------------------------------------- /app/utils/scroll.js: -------------------------------------------------------------------------------- 1 | if (window.history.scrollRestoration) { 2 | window.history.scrollRestoration = "manual"; 3 | } 4 | -------------------------------------------------------------------------------- /app/utils/sw.js: -------------------------------------------------------------------------------- 1 | if ("serviceWorker" in navigator) { 2 | navigator.serviceWorker.register("service-worker.js"); 3 | console.log("Service Worker Registered"); 4 | } else { 5 | console.log("Service Worker Registration Failed"); 6 | } 7 | -------------------------------------------------------------------------------- /app/utils/text.js: -------------------------------------------------------------------------------- 1 | import each from "lodash/each"; 2 | 3 | export function split({ element, expression = " ", append = true }) { 4 | const words = splitText(element.innerHTML.toString().trim(), expression); 5 | 6 | let innerHTML = ""; 7 | 8 | each(words, (line) => { 9 | if (line.indexOf("
") > -1) { 10 | const lines = line.split("
"); 11 | 12 | each(lines, (line, index) => { 13 | innerHTML += index > 0 ? "
" + parseLine(line) : parseLine(line); 14 | }); 15 | } else { 16 | innerHTML += parseLine(line); 17 | } 18 | }); 19 | 20 | element.innerHTML = innerHTML; 21 | 22 | const spans = element.querySelectorAll("span"); 23 | 24 | if (append) { 25 | each(spans, (span) => { 26 | const isSingleLetter = span.textContent.length === 1; 27 | const isNotEmpty = span.innerHTML.trim() !== ""; 28 | const isNotAndCharacter = span.textContent !== "&"; 29 | const isNotDashCharacter = span.textContent !== "-"; 30 | 31 | if ( 32 | isSingleLetter && 33 | isNotEmpty && 34 | isNotAndCharacter && 35 | isNotDashCharacter 36 | ) { 37 | span.innerHTML = `${span.textContent} `; 38 | } 39 | }); 40 | } 41 | 42 | return spans; 43 | } 44 | 45 | export function calculate(spans) { 46 | const lines = []; 47 | let words = []; 48 | 49 | let position = spans[0].offsetTop; 50 | 51 | each(spans, (span, index) => { 52 | if (span.offsetTop === position) { 53 | words.push(span); 54 | } 55 | 56 | if (span.offsetTop !== position) { 57 | lines.push(words); 58 | 59 | words = []; 60 | words.push(span); 61 | 62 | position = span.offsetTop; 63 | } 64 | 65 | if (index + 1 === spans.length) { 66 | lines.push(words); 67 | } 68 | }); 69 | 70 | return lines; 71 | } 72 | 73 | function splitText(text, expression) { 74 | const splits = text.split("
"); 75 | 76 | let words = []; 77 | 78 | each(splits, (item, index) => { 79 | if (index > 0) { 80 | words.push("
"); 81 | } 82 | 83 | words = words.concat(item.split(expression)); 84 | 85 | let isLink = false; 86 | let link = ""; 87 | 88 | const innerHTML = []; 89 | 90 | each(words, (word) => { 91 | if (!isLink && (word.includes("") || word.includes("/strong>"))) { 102 | innerHTML.push(link); 103 | 104 | link = ""; 105 | } 106 | 107 | if (!isLink && link === "") { 108 | innerHTML.push(word); 109 | } 110 | 111 | if (isLink && (word.includes("/a>") || word.includes("/strong>"))) { 112 | isLink = false; 113 | } 114 | }); 115 | 116 | words = innerHTML; 117 | }); 118 | 119 | return words; 120 | } 121 | 122 | function parseLine(line) { 123 | if (line === "") { 124 | return line; 125 | } else if (line === " ") { 126 | return " "; 127 | } else { 128 | line = line.trim(); 129 | 130 | return line === "
" 131 | ? "
" 132 | : `${line}` + (line.length > 1 ? " " : ""); 133 | } 134 | } 135 | -------------------------------------------------------------------------------- /app/vendors/magnet.js: -------------------------------------------------------------------------------- 1 | import gsap from "gsap"; 2 | import { TweenMax, Power4 } from "gsap/gsap-core"; 3 | 4 | var magnets = document.querySelectorAll(".magnet"); 5 | var strength = 50; 6 | 7 | export default function magnetBtn() { 8 | magnets.forEach((magnet) => { 9 | magnet.addEventListener("mousemove", moveMagnet); 10 | magnet.addEventListener("mouseout", function (event) { 11 | TweenMax.to(event.currentTarget, 1, { x: 0, y: 0, ease: Power4.easeOut }); 12 | }); 13 | }); 14 | 15 | function moveMagnet(event) { 16 | var magnetButton = event.currentTarget; 17 | var bounding = magnetButton.getBoundingClientRect(); 18 | 19 | //console.log(magnetButton, bounding) 20 | 21 | TweenMax.to(magnetButton, 1, { 22 | x: 23 | ((event.clientX - bounding.left) / magnetButton.offsetWidth - 0.5) * 24 | strength, 25 | y: 26 | ((event.clientY - bounding.top) / magnetButton.offsetHeight - 0.5) * 27 | strength, 28 | ease: Power4.easeOut 29 | }); 30 | 31 | //magnetButton.style.transform = 'translate(' + (((( event.clientX - bounding.left)/(magnetButton.offsetWidth))) - 0.5) * strength + 'px,'+ (((( event.clientY - bounding.top)/(magnetButton.offsetHeight))) - 0.5) * strength + 'px)'; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /fonts/ampersand.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/fonts/ampersand.woff -------------------------------------------------------------------------------- /fonts/ampersand.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/fonts/ampersand.woff2 -------------------------------------------------------------------------------- /offline/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Node Template 7 | 33 | 34 | 35 | 36 |
37 |

38 | This experience is only available with internet connection. 39 |

40 |
41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "work-1", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "dev": "concurrently --kill-others \"npm run backend:development\" \"npm run frontend:development\"", 8 | "backend:build": "node app.mjs", 9 | "start": "npm run backend:build", 10 | "backend:development": "nodemon app.mjs", 11 | "frontend:build": "webpack --progress --config webpack.config.build.js", 12 | "frontend:development": "cross-env NODE_ENV=dev webpack --progress --config webpack.config.development.js --watch", 13 | "test": "node -c *.js", 14 | "postinstall": "npm run frontend:build" 15 | }, 16 | "engines": { 17 | "node": "14.17.1", 18 | "npm": "6.14.13" 19 | }, 20 | "author": "", 21 | "license": "ISC", 22 | "dependencies": { 23 | "body-parser": "^1.19.2", 24 | "errorhandler": "^1.5.1", 25 | "express": "^4.17.3", 26 | "lodash": "^4.17.21", 27 | "method-override": "^3.0.0", 28 | "morgan": "^1.10.0", 29 | "nodemon": "^2.0.15", 30 | "pug": "^3.0.2", 31 | "ukiyojs": "^3.0.0" 32 | }, 33 | "devDependencies": { 34 | "@babel/core": "^7.17.7", 35 | "auto-bind": "^5.0.1", 36 | "autoprefix": "^1.0.1", 37 | "autoprefixer": "^10.4.3", 38 | "babel-loader": "^8.2.3", 39 | "browser-detect": "^0.2.28", 40 | "browser-sync": "^2.27.9", 41 | "browser-sync-webpack-plugin": "^2.3.0", 42 | "clean-webpack-plugin": "^4.0.0", 43 | "cname-webpack-plugin": "^3.0.0", 44 | "concurrently": "^7.0.0", 45 | "copy-webpack-plugin": "^10.2.4", 46 | "css-loader": "^6.7.1", 47 | "file-loader": "^6.2.0", 48 | "gsap": "^3.9.1", 49 | "html-webpack-plugin": "^5.5.0", 50 | "include-media": "^1.4.10", 51 | "locomotive-scroll": "^4.1.4", 52 | "mini-css-extract-plugin": "^2.6.0", 53 | "node-sass": "^7.0.1", 54 | "nodelist-foreach-polyfill": "^1.2.0", 55 | "postcss": "^8.4.11", 56 | "postcss-loader": "^6.2.1", 57 | "prefix": "^1.0.0", 58 | "pug-loader": "^2.4.0", 59 | "sass-loader": "^12.6.0", 60 | "splitting": "^1.0.6", 61 | "webpack": "^5.70.0", 62 | "webpack-cli": "^4.9.2", 63 | "webpack-dev-server": "^4.7.4", 64 | "webpack-merge": "^5.8.0", 65 | "whatwg-fetch": "^3.6.2" 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | 2 | module.exports = { 3 | plugins: [ 4 | require("autoprefixer"), 5 | require("cssnano")({ 6 | preset: "default" 7 | }) 8 | ] 9 | }; 10 | -------------------------------------------------------------------------------- /public/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/1.jpg -------------------------------------------------------------------------------- /public/about_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/about_1.jpg -------------------------------------------------------------------------------- /public/about_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/about_2.jpg -------------------------------------------------------------------------------- /public/about_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/about_3.jpg -------------------------------------------------------------------------------- /public/about_banner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/about_banner.jpg -------------------------------------------------------------------------------- /public/about_screen.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/about_screen.jpg -------------------------------------------------------------------------------- /public/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/android-chrome-192x192.png -------------------------------------------------------------------------------- /public/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/android-chrome-512x512.png -------------------------------------------------------------------------------- /public/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/apple-touch-icon.png -------------------------------------------------------------------------------- /public/cases/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/cases/1.jpg -------------------------------------------------------------------------------- /public/cases/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/cases/2.jpg -------------------------------------------------------------------------------- /public/cases/3.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/cases/3.webp -------------------------------------------------------------------------------- /public/cases/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/cases/4.jpg -------------------------------------------------------------------------------- /public/cases/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/cases/5.jpg -------------------------------------------------------------------------------- /public/cases/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/cases/6.jpg -------------------------------------------------------------------------------- /public/cases/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/cases/7.jpg -------------------------------------------------------------------------------- /public/cases/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/cases/8.jpg -------------------------------------------------------------------------------- /public/clients/1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/clients/1.webp -------------------------------------------------------------------------------- /public/clients/2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/clients/2.webp -------------------------------------------------------------------------------- /public/clients/3.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/clients/3.webp -------------------------------------------------------------------------------- /public/clients/4.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/clients/4.webp -------------------------------------------------------------------------------- /public/clients/5.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/clients/5.webp -------------------------------------------------------------------------------- /public/clients/6.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/clients/6.webp -------------------------------------------------------------------------------- /public/clients/7.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/clients/7.webp -------------------------------------------------------------------------------- /public/clients/8.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/clients/8.webp -------------------------------------------------------------------------------- /public/contact_banner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/contact_banner.jpg -------------------------------------------------------------------------------- /public/contact_screen.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/contact_screen.jpg -------------------------------------------------------------------------------- /public/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/favicon-16x16.png -------------------------------------------------------------------------------- /public/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/favicon-32x32.png -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/favicon.ico -------------------------------------------------------------------------------- /public/home_screen.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/home_screen.jpg -------------------------------------------------------------------------------- /public/main.js.LICENSE.txt: -------------------------------------------------------------------------------- 1 | /*! 2 | * GSAP 3.9.1 3 | * https://greensock.com 4 | * 5 | * @license Copyright 2008-2021, GreenSock. All rights reserved. 6 | * Subject to the terms at https://greensock.com/standard-license or for 7 | * Club GreenSock members, the agreement issued with that membership. 8 | * @author: Jack Doyle, jack@greensock.com 9 | */ 10 | 11 | /*! 12 | * ScrollTrigger 3.9.1 13 | * https://greensock.com 14 | * 15 | * @license Copyright 2008-2021, GreenSock. All rights reserved. 16 | * Subject to the terms at https://greensock.com/standard-license or for 17 | * Club GreenSock members, the agreement issued with that membership. 18 | * @author: Jack Doyle, jack@greensock.com 19 | */ 20 | -------------------------------------------------------------------------------- /public/offline/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Node Template 7 | 33 | 34 | 35 | 36 |
37 |

38 | This experience is only available with internet connection. 39 |

40 |
41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /public/service-worker.js: -------------------------------------------------------------------------------- 1 | const staticCacheName="jeet-static-v1",filesToCache=["/offline/index.html"];this.addEventListener("install",(e=>{this.skipWaiting(),e.waitUntil(caches.open(staticCacheName).then((e=>e.addAll(filesToCache))))})),this.addEventListener("fetch",(e=>{e.respondWith(caches.match(e.request).then((t=>t||fetch(e.request))).catch((()=>caches.match("/offline/index.html"))))})); -------------------------------------------------------------------------------- /public/site.webmanifest: -------------------------------------------------------------------------------- 1 | {"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} -------------------------------------------------------------------------------- /public/team/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/team/1.jpg -------------------------------------------------------------------------------- /public/team/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/team/2.jpg -------------------------------------------------------------------------------- /public/team/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/team/3.jpg -------------------------------------------------------------------------------- /public/team/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/team/4.jpg -------------------------------------------------------------------------------- /public/team/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/team/5.jpg -------------------------------------------------------------------------------- /public/team/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/public/team/6.jpg -------------------------------------------------------------------------------- /shared/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/1.jpg -------------------------------------------------------------------------------- /shared/about_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/about_1.jpg -------------------------------------------------------------------------------- /shared/about_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/about_2.jpg -------------------------------------------------------------------------------- /shared/about_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/about_3.jpg -------------------------------------------------------------------------------- /shared/about_banner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/about_banner.jpg -------------------------------------------------------------------------------- /shared/about_screen.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/about_screen.jpg -------------------------------------------------------------------------------- /shared/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/android-chrome-192x192.png -------------------------------------------------------------------------------- /shared/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/android-chrome-512x512.png -------------------------------------------------------------------------------- /shared/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/apple-touch-icon.png -------------------------------------------------------------------------------- /shared/cases/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/cases/1.jpg -------------------------------------------------------------------------------- /shared/cases/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/cases/2.jpg -------------------------------------------------------------------------------- /shared/cases/3.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/cases/3.webp -------------------------------------------------------------------------------- /shared/cases/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/cases/4.jpg -------------------------------------------------------------------------------- /shared/cases/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/cases/5.jpg -------------------------------------------------------------------------------- /shared/cases/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/cases/6.jpg -------------------------------------------------------------------------------- /shared/cases/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/cases/7.jpg -------------------------------------------------------------------------------- /shared/cases/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/cases/8.jpg -------------------------------------------------------------------------------- /shared/clients/1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/clients/1.webp -------------------------------------------------------------------------------- /shared/clients/2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/clients/2.webp -------------------------------------------------------------------------------- /shared/clients/3.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/clients/3.webp -------------------------------------------------------------------------------- /shared/clients/4.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/clients/4.webp -------------------------------------------------------------------------------- /shared/clients/5.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/clients/5.webp -------------------------------------------------------------------------------- /shared/clients/6.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/clients/6.webp -------------------------------------------------------------------------------- /shared/clients/7.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/clients/7.webp -------------------------------------------------------------------------------- /shared/clients/8.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/clients/8.webp -------------------------------------------------------------------------------- /shared/contact_banner.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/contact_banner.jpg -------------------------------------------------------------------------------- /shared/contact_screen.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/contact_screen.jpg -------------------------------------------------------------------------------- /shared/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/favicon-16x16.png -------------------------------------------------------------------------------- /shared/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/favicon-32x32.png -------------------------------------------------------------------------------- /shared/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/favicon.ico -------------------------------------------------------------------------------- /shared/home_screen.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/home_screen.jpg -------------------------------------------------------------------------------- /shared/site.webmanifest: -------------------------------------------------------------------------------- 1 | {"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} -------------------------------------------------------------------------------- /shared/team/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/team/1.jpg -------------------------------------------------------------------------------- /shared/team/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/team/2.jpg -------------------------------------------------------------------------------- /shared/team/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/team/3.jpg -------------------------------------------------------------------------------- /shared/team/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/team/4.jpg -------------------------------------------------------------------------------- /shared/team/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/team/5.jpg -------------------------------------------------------------------------------- /shared/team/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MAGGIx1404/awwward-rebuild-SOTD--1/8de8ef16b38f8691f7b9f99bbda53f781172fa92/shared/team/6.jpg -------------------------------------------------------------------------------- /styles/base/base.scss: -------------------------------------------------------------------------------- 1 | @import url("https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&display=swap"); 2 | 3 | @import "locomotive-scroll/dist/locomotive-scroll.min.css"; 4 | // Scroll hijeck 5 | %scrolljeck { 6 | position: fixed; 7 | left: 0; 8 | top: 0; 9 | width: 100%; 10 | height: 100vh; 11 | } 12 | 13 | *, 14 | *:after, 15 | *:before { 16 | box-sizing: border-box; 17 | user-select: none; 18 | } 19 | 20 | html { 21 | background-color: white; 22 | 23 | font-family: "Inter", sans-serif; 24 | 25 | font-size: calc(100vw / 1920 * 10); 26 | line-height: 1; 27 | 28 | @include media(" 16 | 17 | 18 | 19 | meta(name="msapplication-TileColor" content="#ffffff") 20 | meta(name="theme-color" content="#ff9b00") 21 | 22 | 23 | meta(property="og:url" content="/evil-studio/") 24 | meta(property="og:title" content="Evil-Studio") 25 | meta(property="og:description" content="Hello, we are Pethemes. A Creative & digital agency from NY.") 26 | 27 | link(href="main.css" rel="stylesheet") 28 | body 29 | include ./partials/preloader 30 | include ./partials/navigation 31 | 32 | .content#content(data-template=template) 33 | block body 34 | 35 | script(src="main.js") 36 | -------------------------------------------------------------------------------- /views/pages/about.pug: -------------------------------------------------------------------------------- 1 | extends ../base.pug 2 | 3 | block variables 4 | - var template = 'about' 5 | 6 | block body 7 | .about(data-background="" data-color="") 8 | canvas.webgl-container 9 | //- Scroll wrapper 10 | .about__wrapper 11 | .about__banner 12 | .about__banner__picture__wrapper 13 | figure.banner__picture__wrapper__inner 14 | img.banner__picture.parallax__image(data-src="/about_banner.jpg", alt="error") 15 | .about__banner__inner 16 | h1.about__banner__title.splitter Hello, we are Pethemes. 17 | h1.about__banner__title.splitter A Creative & digital agency 18 | h1.about__banner__title.splitter from Istanbul. 19 | .about__us__wrapper 20 | .about__us__wrapper__inner 21 | .about__us__content 22 | p.about__us__paragraph(data-animation="paragraph") As a patch of light concept of the number one Euclid explorations preserve and cherish that pale blue dot rogue. Vanquish the impossible a very small stage in a vast cosmic arena made in the interiors of collapsing stars intelligent beings from which we spring finite but unbounded. 23 | ul.about__us__list(data-scroll data-scroll-offset="50%") 24 | li.about__us__list__item 25 | h1.about__us__list__item__title(data-animation="paragraph") 17+ 26 | p.about__us__list__item__text(data-animation="paragraph") Branches 27 | li.about__us__list__item 28 | h1.about__us__list__item__title(data-animation="paragraph") 157 29 | p.about__us__list__item__text(data-animation="paragraph") Projects 30 | li.about__us__list__item 31 | h1.about__us__list__item__title(data-animation="paragraph") 73 32 | p.about__us__list__item__text(data-animation="paragraph") Clients 33 | li.about__us__list__item 34 | h1.about__us__list__item__title(data-animation="paragraph") 350+ 35 | p.about__us__list__item__text(data-animation="paragraph") Members 36 | .about__screen 37 | figure.about__screen__wrapper 38 | img.about__screen__img.parallax__image(data-src="/about_screen.jpg", alt="About Screen Picture") 39 | .about__service__wrapper 40 | .about__service__wrapper__inner 41 | h1.about__service__wrapper__title(data-animation="paragraph") Solutions 42 | .about__service__wrapper__list 43 | .about__service__wrapper__list__title__wrapper 44 | h4.about__service__wrapper__list__title(data-animation="paragraph") Our Service 45 | .about__service__wrapper__list__content__wrapper 46 | p.about__service__wrapper__paragraph(data-animation="paragraph") Circumnavigated cosmic fugue extraordinary claims require extraordinary evidence not a sunrise but a galaxyrise a mote of dust suspended in a sunbeam the sky calls to us. Invent the universe vastness is bearable only through love rich in heavy atoms rich in mystery star stuff harvesting star light a very small stage in a vast cosmic arena. 47 | p.about__service__wrapper__paragraph(data-animation="paragraph") With pretty stories for which there's little good evidence finite but unbounded finite but unbounded concept of the number one with pretty stories for which there's little good evidence the only home we've ever known. 48 | ul.about__services__list 49 | li.about__service__list__item 50 | p.about__service__list__text(data-animation="paragraph") Print Design 51 | li.about__service__list__item 52 | p.about__service__list__text(data-animation="paragraph") Brand Identity 53 | li.about__service__list__item 54 | p.about__service__list__text(data-animation="paragraph") Art Direction 55 | li.about__service__list__item 56 | p.about__service__list__text(data-animation="paragraph") User Interface 57 | li.about__service__list__item 58 | p.about__service__list__text(data-animation="paragraph") User Experience 59 | li.about__service__list__item 60 | p.about__service__list__text(data-animation="paragraph") Brand Digital 61 | li.about__service__list__item 62 | p.about__service__list__text(data-animation="paragraph") Responsive Design 63 | a.about__service__btn.splitter(href="/") All Services -> 64 | .about__awards__wrapper__list 65 | .about__awards__title__wrapper 66 | h4.about__awards__title(data-animation="paragraph") Our Awards 67 | ul.about__awards__list 68 | li.about__pride__list__item(data-scroll data-scroll-offset="50%") 69 | p.about__list__item__content(data-animation="paragraph") Site Of the Day 70 | p.about__list__item__content(data-animation="paragraph") Awwwards 71 | p.about__list__item__content(data-animation="paragraph") x28 72 | li.about__pride__list__item(data-scroll data-scroll-offset="50%") 73 | p.about__list__item__content(data-animation="paragraph") Site Of the Month 74 | p.about__list__item__content(data-animation="paragraph") Awwwards 75 | p.about__list__item__content(data-animation="paragraph") x13 76 | li.about__pride__list__item(data-scroll data-scroll-offset="50%") 77 | p.about__list__item__content(data-animation="paragraph") Site Of the Year 78 | p.about__list__item__content(data-animation="paragraph") Awwwards 79 | p.about__list__item__content(data-animation="paragraph") x4 80 | li.about__pride__list__item(data-scroll data-scroll-offset="50%") 81 | p.about__list__item__content(data-animation="paragraph") UX Design Of the Month 82 | p.about__list__item__content(data-animation="paragraph") CSSDA 83 | p.about__list__item__content(data-animation="paragraph") x6 84 | li.about__pride__list__item(data-scroll data-scroll-offset="50%") 85 | p.about__list__item__content(data-animation="paragraph") Studio Of the Year 86 | p.about__list__item__content(data-animation="paragraph") CSSDA 87 | p.about__list__item__content(data-animation="paragraph") x2 88 | li.about__pride__list__item(data-scroll data-scroll-offset="50%") 89 | p.about__list__item__content(data-animation="paragraph") Agency Of the Year 90 | p.about__list__item__content(data-animation="paragraph") Golden Apple 91 | p.about__list__item__content(data-animation="paragraph") x1 92 | li.about__pride__list__item(data-scroll data-scroll-offset="50%") 93 | p.about__list__item__content(data-animation="paragraph") Website Of the Day 94 | p.about__list__item__content(data-animation="paragraph") Cyristal Studios 95 | p.about__list__item__content(data-animation="paragraph") x9 96 | 97 | .about__pictures__wrapper 98 | figure.about__pic__wrapper(data-scroll data-scroll-speed="3") 99 | img.about__pic(data-src="/about_1.jpg", alt="error") 100 | figure.about__pic__wrapper(data-scroll data-scroll-speed="4") 101 | img.about__pic(data-src="/about_3.jpg", alt="error") 102 | figure.about__pic__wrapper(data-scroll data-scroll-speed="2") 103 | img.about__pic(data-src="/about_2.jpg", alt="error") 104 | 105 | .about__team__wrapper 106 | .about__team__wrapper__inner 107 | .about__team__title__wrapper 108 | h1.about__team__title__wrapper(data-animation="paragraph") The Squad 109 | .about__team__list 110 | .about__team__list__title__wrapper 111 | h4.about__team__list__title(data-animation="paragraph") Our Team 112 | .about__team__list__content__wrapper 113 | p.about__team__list__text(data-animation="paragraph") Billions upon billions a still more glorious dawn awaits Sea of Tranquility citizens of distant epochs trillion intelligent beings. A very small stage in a vast cosmic arena hundreds of thousands made in the interiors of collapsing stars hundreds of thousands not a sunrise but a galaxyrise muse about? Made in the interiors of collapsing stars the sky calls. 114 | //- slider 115 | .about__team__menu 116 | .about__team__menu__wrapper 117 | .menu__item 118 | figure.menu__item__pic__wrapper(data-name="Humera Landry" data-role="CEO") 119 | img.menu__item__pic(data-src="/team/1.jpg", alt="team pic") 120 | .menu__item 121 | figure.menu__item__pic__wrapper(data-name="Jane Braithwave" data-role="Graphic Designer") 122 | img.menu__item__pic(data-src="/team/2.jpg", alt="team pic") 123 | .menu__item 124 | figure.menu__item__pic__wrapper(data-name="Kirsty Ball" data-role="UI / UX Designer") 125 | img.menu__item__pic(data-src="/team/3.jpg", alt="team pic") 126 | .menu__item 127 | figure.menu__item__pic__wrapper(data-name="Darnell Irving" data-role="CTO") 128 | img.menu__item__pic(data-src="/team/4.jpg", alt="team pic") 129 | .menu__item 130 | figure.menu__item__pic__wrapper(data-name="Erika Moses" data-role="Art Director") 131 | img.menu__item__pic(data-src="/team/5.jpg", alt="team pic") 132 | .menu__item 133 | figure.menu__item__pic__wrapper(data-name="Willa Porter" data-role="Graphic Designer") 134 | img.menu__item__pic(data-src="/team/6.jpg", alt="team pic") 135 | 136 | .about__client__wrapper 137 | .about__client__wrapper__inner 138 | p.about__client__wrapper__paragraph(data-animation="paragraph") How far away a mote of dust suspended in a sunbeam rich in heavy atoms stirred by starlight Flatland tesseract. Realm of the galaxies colonies realm of the galaxies Sea of Tranquility star stuff harvesting star light the carbon in our apple pies. Citizens of distant. 139 | .about__partner__lists 140 | .about__partner__list(data-scroll data-scroll-speed="4" data-scroll-direction="horizontal") 141 | figure.about__partner__box 142 | img.about__partner__img(data-src="/clients/1.webp", alt="error") 143 | figure.about__partner__box 144 | img.about__partner__img(data-src="/clients/2.webp", alt="error") 145 | figure.about__partner__box 146 | img.about__partner__img(data-src="/clients/3.webp", alt="error") 147 | figure.about__partner__box 148 | img.about__partner__img(data-src="/clients/4.webp", alt="error") 149 | figure.about__partner__box 150 | img.about__partner__img(data-src="/clients/5.webp", alt="error") 151 | .about__partner__list(data-scroll data-scroll-speed="-4" data-scroll-direction="horizontal") 152 | figure.about__partner__box 153 | img.about__partner__img(data-src="/clients/5.webp", alt="error") 154 | figure.about__partner__box 155 | img.about__partner__img(data-src="/clients/6.webp", alt="error") 156 | figure.about__partner__box 157 | img.about__partner__img(data-src="/clients/7.webp", alt="error") 158 | figure.about__partner__box 159 | img.about__partner__img(data-src="/clients/8.webp", alt="error") 160 | figure.about__partner__box 161 | img.about__partner__img(data-src="/clients/1.webp", alt="error") 162 | 163 | //- footer 164 | include ../partials/footer 165 | -------------------------------------------------------------------------------- /views/pages/contact.pug: -------------------------------------------------------------------------------- 1 | extends ../base.pug 2 | 3 | block variables 4 | - var template = 'contact' 5 | 6 | block body 7 | .contact(data-background="" data-color="") 8 | canvas.webgl-container 9 | //- Scroll wrapper 10 | .contact__wrapper 11 | .contact__banner__wrapper 12 | .contact__banner__picture__wrapper__2 13 | .contact__banner__picture__wrapper__2__inner 14 | figure.banner__picture__wrapper__inner 15 | img.banner__picture.parallax__image(data-src="/contact_banner.jpg", alt="error") 16 | .contact__banner__wrapper__inner 17 | .contact__banner__title__wrapper 18 | h1.contact__banner__title.splitter Get in touch! 19 | .contact__banner__main__wrapper 20 | .contact__banner__main__wrapper__inner 21 | .contact__banner__form__wrapper 22 | h4.contact__form__title Hi. Tell us about your project. #[br] Fill the form below; 23 | form.contact__form(action="/") 24 | input.contact__form__company__name(type="text" placeholder="Company Name" name="company" required) 25 | input.contact__form__name(type="text" placeholder="Your Name" name="name" required) 26 | input.contact__form__number(type="text" placeholder="Phone Number" name="number" required) 27 | input.contact__form__email(type="text" placeholder="E-mail" name="mail" required) 28 | input.contact__form__subject(type="text" placeholder="Subject" name="subject" required) 29 | textarea#contact__form__content__wrapper.contact__form__content__wrapper(name="form_content" placeholder="Your Message" , cols="30", rows="10") 30 | input#submit__btn(type="submit", value="SUBMIT") 31 | .contact__banner__picture__wrapper 32 | figure.contact__banner__picture__wrapper__inner 33 | img.contact__banner__picture.parallax__image(data-src="/contact_screen.jpg", alt="Contact Picture") 34 | 35 | include ../partials/footer 36 | -------------------------------------------------------------------------------- /views/pages/home.pug: -------------------------------------------------------------------------------- 1 | extends ../base.pug 2 | 3 | block variables 4 | - var template = 'home' 5 | 6 | block body 7 | .home(data-background="" data-color="") 8 | canvas.webgl-container 9 | //- Scroll wrapper 10 | .home__wrapper 11 | .home__banner 12 | .home__banner__inner 13 | h1.home__title.splitter Hello, 14 | h1.home__title.splitter we are an 15 | h1.home__title.splitter independent 16 | h1.home__title.splitter 17 | a.home__title__link(href="/") creative agency 18 | h1.home__title.splitter 19 | a.home__title__link(href="/") in the Istanbul 20 | h1.home__title.splitter who connect 21 | h1.home__title.splitter 22 | a.home__title__link(href="/") brands with 23 | h1.home__title.splitter 24 | a.home__title__link(href="/") their audiences 25 | h1.home__title.splitter using design, 26 | h1.home__title.splitter 27 | a.home__title__link(href="/") technology 28 | h1.home__title.splitter and insights. 29 | 30 | .home__screen 31 | figure.home__inner__screen 32 | img.home__screen__img.parallax__image(data-src="/home_screen.jpg", alt="Home Screen Picture") 33 | 34 | .home__screen__content 35 | .home__screen__content__inner 36 | p.home__screen__content__paragraph(data-animation="paragraph") Something incredible is waiting to be known hydrogen atoms billions upon billions birth Tunguska event Sea of Tranquility? A still more glorious dawn awaits invent the universe at the edge of forever bits of moving fluff preserve and cherish that pale blue dot another world. 37 | //- lists 38 | .lists__wrapper(data-scroll data-scroll-offset="50%") 39 | //- LIST ONE 40 | ul.service__list 41 | li.service__list__item 42 | p.service__list__item__content(data-animation="paragraph") Product strategy 43 | li.service__list__item 44 | p.service__list__item__content(data-animation="paragraph") UX and UI design 45 | li.service__list__item 46 | p.service__list__item__content(data-animation="paragraph") Front-end development 47 | li.service__list__item 48 | p.service__list__item__content(data-animation="paragraph") Back-end development 49 | li.service__list__item 50 | p.service__list__item__content(data-animation="paragraph") QA 51 | li.service__list__item 52 | p.service__list__item__content(data-animation="paragraph") Support 53 | //- LIST TWO 54 | ul.service__list 55 | li.service__list__item 56 | p.service__list__item__content(data-animation="paragraph") Strategy 57 | li.service__list__item 58 | p.service__list__item__content(data-animation="paragraph") Brand identity design 59 | li.service__list__item 60 | p.service__list__item__content(data-animation="paragraph") Creative web design 61 | li.service__list__item 62 | p.service__list__item__content(data-animation="paragraph") Graphic design and CGI 63 | li.service__list__item 64 | p.service__list__item__content(data-animation="paragraph") Content development 65 | li.service__list__item 66 | p.service__list__item__content(data-animation="paragraph") Creative front-end 67 | //- LIST THREE 68 | ul.service__list 69 | li.service__list__item 70 | p.service__list__item__content(data-animation="paragraph") Back-end development 71 | li.service__list__item 72 | p.service__list__item__content(data-animation="paragraph") Mobile Development 73 | li.service__list__item 74 | p.service__list__item__content(data-animation="paragraph") Photograpy 75 | li.service__list__item 76 | p.service__list__item__content(data-animation="paragraph") Video Production 77 | //- link 78 | .magnet.home__screen__link__wrapper 79 | a.home__screen__content__link.splitter(href="/about") See All Service -> 80 | 81 | .home__work__wrapper 82 | .home__work__inner__wrapper 83 | .home__work__title__wrapper 84 | h1.home__work__title(data-animation="paragraph") Recent Works 85 | //- works 86 | .home__work__list 87 | .home__work__inner__list 88 | //- work box 89 | .home__work__box 90 | figure.home__work__pic__wrapper 91 | img.home__work__pic.parallax__image(data-src="/cases/1.jpg", alt="work image") 92 | a.home__work__title.splitter(href="/work/spirits_of_illusion") Spirit of illusion 93 | //- work box 94 | .home__work__box 95 | figure.home__work__pic__wrapper 96 | img.home__work__pic.parallax__image(data-src="/cases/2.jpg", alt="work image") 97 | a.home__work__title.splitter(href="/work/the_secrets") The Secrets 98 | //- work box 99 | .home__work__box 100 | figure.home__work__pic__wrapper 101 | img.home__work__pic.parallax__image(data-src="/cases/3.webp", alt="work image") 102 | a.home__work__title.splitter(href="/work/emerald_planet") Emerald Planet 103 | //- work box 104 | .home__work__box 105 | figure.home__work__pic__wrapper 106 | img.home__work__pic.parallax__image(data-src="/cases/5.jpg", alt="work image") 107 | a.home__work__title.splitter(href="/work/rainbows") Rainbows 108 | //- work box 109 | .home__work__box 110 | figure.home__work__pic__wrapper 111 | img.home__work__pic.parallax__image(data-src="/cases/4.jpg", alt="work image") 112 | a.home__work__title.splitter(href="/work/the_silks") The Silks 113 | //- work box 114 | .home__work__box 115 | figure.home__work__pic__wrapper 116 | img.home__work__pic.parallax__image(data-src="/cases/6.jpg", alt="work image") 117 | a.home__work__title.splitter(href="/work/olivia_arnold") Olivia Arnold 118 | 119 | .magnet.home__work__link__wrapper 120 | a.home__work__link.splitter(href="/portfolio") See All Projects -> 121 | 122 | .home__partner__wrapper 123 | .home__partner__inner__wrapper 124 | .home__partner__title__wrapper 125 | h1.home__partner__title(data-animation="paragraph") Trustful Partners. 126 | .home__partner__content__wrapper 127 | p.home__partner__paragraph(data-animation="paragraph") Brain is the seed of intelligence a still more glorious dawn awaits the ash of stellar alchemy two ghostly white figures in coveralls and helmets are softly dancing not a sunrise but a galaxyrise bits of moving fluff. Culture citizens of distant epochs the only home we've ever known with pretty stories for which there's little good evidence descended from astronomers take root and flourish. 128 | .home__partner__lists 129 | .home__partner__list(data-scroll data-scroll-speed="4" data-scroll-direction="horizontal") 130 | figure.home__partner__box 131 | img.home__partner__img(data-src="/clients/1.webp", alt="error") 132 | figure.home__partner__box 133 | img.home__partner__img(data-src="/clients/2.webp", alt="error") 134 | figure.home__partner__box 135 | img.home__partner__img(data-src="/clients/3.webp", alt="error") 136 | figure.home__partner__box 137 | img.home__partner__img(data-src="/clients/4.webp", alt="error") 138 | figure.home__partner__box 139 | img.home__partner__img(data-src="/clients/5.webp", alt="error") 140 | .home__partner__list(data-scroll data-scroll-speed="-4" data-scroll-direction="horizontal") 141 | figure.home__partner__box 142 | img.home__partner__img(data-src="/clients/5.webp", alt="error") 143 | figure.home__partner__box 144 | img.home__partner__img(data-src="/clients/6.webp", alt="error") 145 | figure.home__partner__box 146 | img.home__partner__img(data-src="/clients/7.webp", alt="error") 147 | figure.home__partner__box 148 | img.home__partner__img(data-src="/clients/8.webp", alt="error") 149 | figure.home__partner__box 150 | img.home__partner__img(data-src="/clients/1.webp", alt="error") 151 | .home__pride 152 | .home__pride__wrapper 153 | .home__pride__content 154 | .home__pride__title__wrapper 155 | h1.home__pride__title(data-animation="paragraph") Source #[br] of #[br] pride. 156 | .home__pride__paragraph__wrapper 157 | p.home__pride__paragraph(data-animation="paragraph") A mote of dust suspended in a sunbeam ship of the imagination kindling the energy hidden in matter Cambrian explosion star stuff harvesting star light Tunguska event. From which we spring the only home we've ever known vanquish the impossible encyclopaedia galactica rich in heavy atoms globular star cluster. 158 | ul.home__pride__list 159 | li.home__pride__list__item(data-scroll data-scroll-offset="50%") 160 | p.home__pride__list__item__content(data-animation="paragraph") Site Of the Day 161 | p.home__pride__list__item__content(data-animation="paragraph") Awwwards 162 | p.home__pride__list__item__content(data-animation="paragraph") x28 163 | li.home__pride__list__item(data-scroll data-scroll-offset="50%") 164 | p.home__pride__list__item__content(data-animation="paragraph") Site Of the Month 165 | p.home__pride__list__item__content(data-animation="paragraph") Awwwards 166 | p.home__pride__list__item__content(data-animation="paragraph") x13 167 | li.home__pride__list__item(data-scroll data-scroll-offset="50%") 168 | p.home__pride__list__item__content(data-animation="paragraph") Site Of the Year 169 | p.home__pride__list__item__content(data-animation="paragraph") Awwwards 170 | p.home__pride__list__item__content(data-animation="paragraph") x4 171 | li.home__pride__list__item(data-scroll data-scroll-offset="50%") 172 | p.home__pride__list__item__content(data-animation="paragraph") UX Design Of the Month 173 | p.home__pride__list__item__content(data-animation="paragraph") CSSDA 174 | p.home__pride__list__item__content(data-animation="paragraph") x6 175 | li.home__pride__list__item(data-scroll data-scroll-offset="50%") 176 | p.home__pride__list__item__content(data-animation="paragraph") Studio Of the Year 177 | p.home__pride__list__item__content(data-animation="paragraph") CSSDA 178 | p.home__pride__list__item__content(data-animation="paragraph") x2 179 | li.home__pride__list__item(data-scroll data-scroll-offset="50%") 180 | p.home__pride__list__item__content(data-animation="paragraph") Agency Of the Year 181 | p.home__pride__list__item__content(data-animation="paragraph") Golden Apple 182 | p.home__pride__list__item__content(data-animation="paragraph") x1 183 | li.home__pride__list__item(data-scroll data-scroll-offset="50%") 184 | p.home__pride__list__item__content(data-animation="paragraph") Website Of the Day 185 | p.home__pride__list__item__content(data-animation="paragraph") Cyristal Studios 186 | p.home__pride__list__item__content(data-animation="paragraph") x9 187 | 188 | include ../partials/footer 189 | -------------------------------------------------------------------------------- /views/pages/portfolio.pug: -------------------------------------------------------------------------------- 1 | extends ../base.pug 2 | 3 | block variables 4 | - var template = 'portfolio' 5 | 6 | block body 7 | .portfolio(data-background="" data-color="") 8 | canvas.webgl-container 9 | img(data-src="/1.jpg", alt="") 10 | //- Scroll wrapper 11 | .portfolio__wrapper 12 | .portfolio__banner 13 | .portfolio__menu 14 | ul.portfolio__menu__wrapper 15 | li.portfolio__menu__item 16 | a.portfolio__menu__item__link.splitter(href="/works/spirits_of_illusion") Spirits of Illusion 17 | figure.portfolio__menu__item__image__wrapper 18 | img.portfolio__menu__item__image(data-src="/cases/1.jpg", alt="error") 19 | li.portfolio__menu__item 20 | a.portfolio__menu__item__link.splitter(href="/works/the_secrets") The Secrets 21 | figure.portfolio__menu__item__image__wrapper 22 | img.portfolio__menu__item__image(data-src="/cases/2.jpg", alt="error") 23 | li.portfolio__menu__item 24 | a.portfolio__menu__item__link.splitter(href="/works/emerald_planet") Emerald Planet 25 | figure.portfolio__menu__item__image__wrapper 26 | img.portfolio__menu__item__image(data-src="/cases/3.webp", alt="error") 27 | li.portfolio__menu__item 28 | a.portfolio__menu__item__link.splitter(href="/works/rainbows") Rainbows 29 | figure.portfolio__menu__item__image__wrapper 30 | img.portfolio__menu__item__image(data-src="/cases/5.jpg", alt="error") 31 | li.portfolio__menu__item 32 | a.portfolio__menu__item__link.splitter(href="/works/the_silks") The Silks 33 | figure.portfolio__menu__item__image__wrapper 34 | img.portfolio__menu__item__image(data-src="/cases/4.jpg", alt="error") 35 | li.portfolio__menu__item 36 | a.portfolio__menu__item__link.splitter(href="/works/olivia_arnold") Olivia Arnold 37 | figure.portfolio__menu__item__image__wrapper 38 | img.portfolio__menu__item__image(data-src="/cases/6.jpg", alt="error") 39 | li.portfolio__menu__item 40 | a.portfolio__menu__item__link.splitter(href="/works/shiny_diamond") Shiny Diamond 41 | figure.portfolio__menu__item__image__wrapper 42 | img.portfolio__menu__item__image(data-src="/cases/7.jpg", alt="error") 43 | li.portfolio__menu__item 44 | a.portfolio__menu__item__link.splitter(href="/works/pierre") Pierre 45 | figure.portfolio__menu__item__image__wrapper 46 | img.portfolio__menu__item__image(data-src="/cases/8.jpg", alt="error") 47 | -------------------------------------------------------------------------------- /views/pages/works/emerald_planet.pug: -------------------------------------------------------------------------------- 1 | extends ../../base.pug 2 | include ./work.pug 3 | 4 | block variables 5 | - var template = 'work' 6 | 7 | block body 8 | +template({ 9 | id: "emerald_planet", 10 | banner: { 11 | pic: "https://images.prismic.io/alioth/c43380d2-cabf-4971-895f-4c90a252c8f5_3.webp?auto=compress,format", 12 | title: "Emerald Planet", 13 | role: "Photography", 14 | }, 15 | info: { 16 | date: "Last Penya - 2017", 17 | text: "At the edge of forever hydrogen atoms tendrils of gossamer clouds rich in mystery circumnavigated Orion's sword. Dream of the mind's eye paroxysm of global death Sea of Tranquility the sky calls to us Sea of Tranquility another world. Vastness is bearable only through love invent the universe not a sunrise but a galaxyrise star stuff harvesting." 18 | }, 19 | picsOne: { 20 | 1: "https://images.prismic.io/alioth/7f71f546-c345-498c-9be8-f53b79d6280f_emerald_1.jpg?auto=compress,format", 21 | 2: "https://images.prismic.io/alioth/acd1ee30-60bf-46b5-a534-a333e79b5fbc_emerald_2.jpg?auto=compress,format", 22 | }, 23 | work: { 24 | text_one: "Great turbulent clouds cosmic ocean cosmos globular star cluster hydrogen atoms gathered by gravity. How far away as a patch of light how far away made in the interiors of collapsing stars extraplanetary a very small stage in a vast cosmic arena. Concept of the number one billions upon billions encyclopaedia galactica encyclopaedia galactic are creatures of the cosmos rich in heavy atoms.", 25 | text_two: "Patch of Light", 26 | text_three: "Encyclopaedia galactica cosmic fugue corpus callosum the ash of stellar alchemy tingling of the spine explorations. Euclid white dwarf the sky calls to us hydrogen atoms emerged into consciousness extraordinary claims require extraordinary evidence? Paroxysm of global death citizens of distant epochs Sea of Tranquility a very small stage in a vast cosmic arena emerged into consciousness a still more glorious dawn awaits." 27 | }, 28 | extra: "https://images.prismic.io/alioth/cef44e60-31ce-44c6-95d5-2d08414e5bb1_emerald_3.jpg?auto=compress,format", 29 | picsTwo: { 30 | 1: "https://images.prismic.io/alioth/a14a55f8-d748-437a-9e20-95759f2c69a0_emerald_4.jpg?auto=compress,format", 31 | 2: "https://images.prismic.io/alioth/e508f27b-071a-4584-845d-ad11f89aca8e_emerald_5.jpg?auto=compress,format", 32 | }, 33 | next: { 34 | pic: "https://images.prismic.io/alioth/50624eb8-7e3e-4975-bc7b-91c926f96795_2.jpg?auto=compress,format", 35 | title: "The Secrets", 36 | id: "the_secrets" 37 | } 38 | }) 39 | -------------------------------------------------------------------------------- /views/pages/works/olivia_arnold.pug: -------------------------------------------------------------------------------- 1 | extends ../../base.pug 2 | include ./work.pug 3 | 4 | block variables 5 | - var template = 'work' 6 | 7 | block body 8 | +template({ 9 | id: "olivia_arnold", 10 | banner: { 11 | pic: "https://images.prismic.io/alioth/6031400f-2683-47d6-85b9-526fdadf6797_5.jpg?auto=compress,format", 12 | title: "Olivia Arnold", 13 | role: "Photography" 14 | }, 15 | info: { 16 | date: "Zeina - 2020", 17 | text: "Gathered by gravity take root and flourish of brilliant syntheses billions upon billions white dwarf billions upon billions? Stirred by starlight Hypatia emerged into consciousness as a patch of light stirred by starlight the carbon in our apple pies? Rich in heavy atoms preserve and cherish that pale blue dot permanence of the stars realm of the galaxies." 18 | }, 19 | picsOne: { 20 | 1: "https://images.prismic.io/alioth/d4aeeffc-30bf-48c7-b117-429e3374b930_olivia_1.jpg?auto=compress,format", 21 | 2: "https://images.prismic.io/alioth/517c511b-4f62-4161-8fbf-2e7844b27124_olivia_2.jpg?auto=compress,format", 22 | }, 23 | work: { 24 | text_one: "Great turbulent clouds cosmic ocean cosmos globular star cluster hydrogen atoms gathered by gravity. How far away as a patch of light how far away made in the interiors of collapsing stars extraplanetary a very small stage in a vast cosmic arena. Concept of the number one billions upon billions encyclopaedia galactica encyclopaedia galactica are creatures of the cosmos rich in heavy atoms.", 25 | text_two: "The Interiors", 26 | text_three: "Permanence of the stars great turbulent clouds Flatland Cambrian explosion paroxysm of global death Vangelis. Colonies realm of the galaxies vastness is bearable only through love emerged into consciousness intelligent beings shores of the cosmic ocean. Hearts of the stars the carbon in our apple pies vastness is bearable only through love muse about something incredible is waiting to be known encyclopaedia galactica? Emerged into consciousness the ash of stellar alchemy a still more glorious dawn awaits a still more glorious dawn awaits courage of our questions star stuff harvesting star light?" 27 | }, 28 | extra: "https://images.prismic.io/alioth/497560a9-6fec-41ba-9e79-2c0086fdbf15_olivia_3.jpg?auto=compress,format", 29 | picsTwo: { 30 | 1: "https://images.prismic.io/alioth/2bddd481-62c9-4aa2-9116-1bd91c2a0873_olivia_4.jpg?auto=compress,format", 31 | 2: "https://images.prismic.io/alioth/05905351-535a-41aa-8e7c-715c69277df3_olivia_5.jpg?auto=compress,format" 32 | }, 33 | next: { 34 | pic: "https://images.prismic.io/alioth/2a71a6bc-0230-49c7-9cf7-948fd733b354_4.jpg?auto=compress,format", 35 | title: "The Silks", 36 | id: "the_silks" 37 | } 38 | }) 39 | -------------------------------------------------------------------------------- /views/pages/works/pierre.pug: -------------------------------------------------------------------------------- 1 | extends ../../base.pug 2 | include ./work.pug 3 | 4 | block variables 5 | - var template = 'work' 6 | 7 | block body 8 | +template({ 9 | id: "pierre", 10 | banner: { 11 | pic: "https://images.prismic.io/alioth/c7cbf9eb-2fa7-4820-a924-0a6203e12426_8.jpg?auto=compress,format", 12 | title: "Pierre", 13 | role: "UI/UX Design" 14 | }, 15 | info: { 16 | date: "Beat - 2014", 17 | text: "From which we spring not a sunrise but a galaxyrise across the centuries Tunguska event Euclid descended from astronomers? Muse about emerged into consciousness vanquish the impossible the sky calls to us Orion's sword venture. Astonishment rings of Uranus stirred by starlight venture two ghostly white figures in coveralls and helmets." 18 | }, 19 | picsOne: { 20 | 1: "https://images.prismic.io/alioth/4d948a07-723f-4a0c-b002-98fd2f138578_pierre_1.jpg?auto=compress,format", 21 | 2: "https://images.prismic.io/alioth/c641defa-33ea-4f1f-a192-8db45b6f2a19_pierre_2.jpg?auto=compress,format", 22 | 3: "https://images.prismic.io/alioth/ff04c6a8-368a-44d7-9212-606678053418_pierre_3.jpg?auto=compress,format&rect=0,1,1918,1115&w=1920&h=1116", 23 | 4: "https://images.prismic.io/alioth/4dd3d341-eee0-4c39-aa29-5cde14db82da_pierre_4.jpg?auto=compress,format" 24 | }, 25 | work: { 26 | text_one: "Citizens of distant epochs stirred by starlight white dwarf Sea of Tranquility a still more glorious dawn awaits tendrils of gossamer clouds? Extraordinary claims require extraordinary evidence something incredible is waiting to be known prime number prime number at the edge of forever two ghostly white figures in coveralls and helmets are softly dancing. Two ghostly white figures in coveralls and helmets are softly dancing great turbulent clouds muse about with pretty stories for which there's little good evidence take root and flourish a mote of dust suspended in a sunbeam.", 27 | text_two: "Patch of Light", 28 | text_three: "Culture colonies explorations emerged into consciousness across the centuries venture. Dream of the mind's eye Jean-François Champollion something incredible is waiting to be known circumnavigated stirred by starlight how far away. Finite but unbounded great turbulent clouds two ghostly white figures in coveralls and helmets are softly dancing how far away gathered by gravity courage of our questions." 29 | }, 30 | extra: "https://images.prismic.io/alioth/253aa385-278e-422d-b502-7f54b2a483b8_pierre_5.jpg?auto=compress,format", 31 | picsTwo: { 32 | 1: "https://images.prismic.io/alioth/a0506b3b-592a-43e4-b37d-ee4c659933f0_pierre_6.jpg?auto=compress,format", 33 | 2: "https://images.prismic.io/alioth/26fa7a19-f212-4699-8121-4fddc1abae9c_pierre_7.jpg?auto=compress,format", 34 | 3: "https://images.prismic.io/alioth/2f9196ad-6dd0-4b10-b020-d17dc597f084_pierre_8.jpg?auto=compress,format" 35 | }, 36 | next: { 37 | pic: "https://images.prismic.io/alioth/705958c2-7081-40b0-ac32-0421d8b986ab_7.jpg?auto=compress,format&rect=1,0,1917,1279&w=1920&h=1281", 38 | title: "Shiny Diamond", 39 | id: "shiny_diamond" 40 | } 41 | }) 42 | -------------------------------------------------------------------------------- /views/pages/works/rainbows.pug: -------------------------------------------------------------------------------- 1 | extends ../../base.pug 2 | include ./work.pug 3 | 4 | block variables 5 | - var template = 'work' 6 | 7 | block body 8 | +template({ 9 | id: "rainbows", 10 | banner: { 11 | pic: "https://images.prismic.io/alioth/6031400f-2683-47d6-85b9-526fdadf6797_5.jpg?auto=compress,format", 12 | title: "Rainbows", 13 | role: "Photography" 14 | }, 15 | info: { 16 | date: "Strawbery - 2015", 17 | text: "From which we spring not a sunrise but a galaxyrise across the centuries Tunguska event Euclid descended from astronomers? Muse about emerged into consciousness vanquish the impossible the sky calls to us Orion's sword venture. Astonishment rings of Uranus stirred by starlight venture two ghostly white figures in coveralls and helmets." 18 | }, 19 | picsOne: { 20 | 1: "https://images.prismic.io/alioth/1a4d2390-be5e-41ee-8d32-421485658e88_rainbow_1.webp?auto=compress,format", 21 | 2: "https://images.prismic.io/alioth/2a04ae8f-1429-42aa-9b5a-e35679b6855e_rainbow_2.webp?auto=compress,format", 22 | 3: "https://images.prismic.io/alioth/dd4491be-753c-4967-a1eb-5db1c72dafde_rainbow_3.webp?auto=compress,format", 23 | 4: "https://images.prismic.io/alioth/ccf40333-264e-4ee9-950e-3bc1f55a3801_rainbow_4.webp?auto=compress,format" 24 | }, 25 | work: { 26 | text_one: "Citizens of distant epochs stirred by starlight white dwarf Sea of Tranquility a still more glorious dawn awaits tendrils of gossamer clouds? Extraordinary claims require extraordinary evidence something incredible is waiting to be known prime number prime number at the edge of forever two ghostly white figures in coveralls and helmets are softly dancing. Two ghostly white figures in coveralls and helmets are softly dancing great turbulent clouds muse about with pretty stories for which there's little good evidence take root and flourish a mote of dust suspended in a sunbeam.", 27 | text_two: "Patch of Light", 28 | text_three: "Culture colonies explorations emerged into consciousness across the centuries venture. Dream of the mind's eye Jean-François Champollion something incredible is waiting to be known circumnavigated stirred by starlight how far away. Finite but unbounded great turbulent clouds two ghostly white figures in coveralls and helmets are softly dancing how far away gathered by gravity courage of our questions." 29 | }, 30 | extra: "https://images.prismic.io/alioth/6031400f-2683-47d6-85b9-526fdadf6797_5.jpg?auto=compress,format", 31 | picsTwo: { 32 | 1: "https://images.prismic.io/alioth/7a7cb2f1-a20b-47d9-8513-cd1e37ded86f_rainbow_5.webp?auto=compress,format", 33 | 2: "https://images.prismic.io/alioth/952b2343-c742-423e-97ab-08f83b9c3c2d_rainbow_6.webp?auto=compress,format" 34 | }, 35 | next: { 36 | pic: "https://images.prismic.io/alioth/c43380d2-cabf-4971-895f-4c90a252c8f5_3.webp?auto=compress,format", 37 | title: "Emerald Planet", 38 | id: "emerald_planet" 39 | } 40 | }) 41 | -------------------------------------------------------------------------------- /views/pages/works/shiny_diamond.pug: -------------------------------------------------------------------------------- 1 | extends ../../base.pug 2 | include ./work.pug 3 | 4 | block variables 5 | - var template = 'work' 6 | 7 | block body 8 | +template({ 9 | id: "shiny_diamond", 10 | banner: { 11 | pic: "https://images.prismic.io/alioth/705958c2-7081-40b0-ac32-0421d8b986ab_7.jpg?auto=compress,format&rect=1,0,1917,1279&w=1920&h=1281", 12 | title: "Shiny Diamond", 13 | role: "Video Production" 14 | }, 15 | info: { 16 | date: "Beat - 2014", 17 | text: "From which we spring not a sunrise but a galaxyrise across the centuries Tunguska event Euclid descended from astronomers? Muse about emerged into consciousness vanquish the impossible the sky calls to us Orion's sword venture. Astonishment rings of Uranus stirred by starlight venture two ghostly white figures in coveralls and helmets." 18 | }, 19 | picsOne: { 20 | 1: "https://images.prismic.io/alioth/fd30665c-baf3-4cb2-b15f-54fc0a0ab823_shiny_1.jpg?auto=compress,format", 21 | 2: "https://images.prismic.io/alioth/c34ebfe7-292e-4434-b85b-33b5707d727e_shiny_2.jpg?auto=compress,format", 22 | 3: "https://images.prismic.io/alioth/f062e844-d71a-4873-9c74-699d3404b7a9_shiny_3.jpg?auto=compress,format&rect=1,0,1917,1279&w=1920&h=1281", 23 | }, 24 | work: { 25 | text_one: "Great turbulent clouds cosmic ocean cosmos globular star cluster hydrogen atoms gathered by gravity. How far away as a patch of light how far away made in the interiors of collapsing stars extraplanetary a very small stage in a vast cosmic arena. Concept of the number one billions upon billions encyclopaedia galactica encyclopaedia galactic are creatures of the cosmos rich in heavy atoms.", 26 | text_two: "Production", 27 | text_three: "Culture colonies explorations emerged into consciousness across the centuries venture. Dream of the mind's eye Jean-François Champollion something incredible is waiting to be known circumnavigated stirred by starlight how far away. Finite but unbounded great turbulent clouds two ghostly white figures in coveralls and helmets are softly dancing how far away gathered by gravity courage of our questions." 28 | }, 29 | extra: "https://images.prismic.io/alioth/6f5d1a89-1a2a-444a-9bc0-accac9833a4a_shiny_4.jpg?auto=compress,format", 30 | picsTwo: { 31 | 1: "https://images.prismic.io/alioth/0c62ca12-58e1-4b70-b5db-9a0f9b95e52a_shiny_5.jpg?auto=compress,format&rect=1,0,1917,1279&w=1920&h=1281", 32 | 2: "https://images.prismic.io/alioth/d72231f3-1d17-4d86-8aac-fb39c3a26f28_shiny_6.jpg?auto=compress,format&rect=1,0,1917,1279&w=1920&h=1281" 33 | }, 34 | next: { 35 | pic: "https://images.prismic.io/alioth/3ff548be-b1e0-4549-aca0-3c2df8d3424f_6.jpg?auto=compress,format", 36 | title: "Olivia Arnold", 37 | id: "olivia_arnold" 38 | } 39 | }) 40 | -------------------------------------------------------------------------------- /views/pages/works/spirits_of_illusion.pug: -------------------------------------------------------------------------------- 1 | extends ../../base.pug 2 | include ./work.pug 3 | 4 | block variables 5 | - var template = 'work' 6 | 7 | block body 8 | +template({ 9 | id: "spirits_of_illusion", 10 | banner: { 11 | pic: "https://images.prismic.io/alioth/ac17c5b5-4c5f-42d2-9472-235acdad2acf_1.jpg?auto=compress,format", 12 | title: "Spirits of illusion", 13 | role: "Production" 14 | }, 15 | info: { 16 | date: "Coffee Lab - 2017", 17 | text: "As a patch of light Flatland courage of our questions light years Tunguska event radio telescope. Paroxysm of global death paroxysm of global death explorations emerged into consciousness rings of Uranus descended from astronomers? Take root and flourish from which we spring muse about the carbon in our apple pies extraordinary claims require extraordinary evidence the carbon in our apple pies." 18 | }, 19 | picsOne: { 20 | 1: "https://images.prismic.io/alioth/3617f758-1506-4b7e-8a38-1083e7b86bbb_illusion_1.jpg?auto=compress,format", 21 | 2: "https://images.prismic.io/alioth/bdf7c622-9ceb-418b-8f59-bc26f3e47e77_illusion_2.jpg?auto=compress,format", 22 | 3: "https://images.prismic.io/alioth/3ee65e9c-3e9e-41e1-8796-ae2cc61defd8_illusion_3.jpg?auto=compress,format", 23 | 4: "https://images.prismic.io/alioth/6e0a5217-c3ad-4dbd-89c0-3c891de41330_illusion_4.jpg?auto=compress,format", 24 | 5: "https://images.prismic.io/alioth/2692285d-37f5-4f52-9d2f-d8821f0de546_illusion_5.jpg?auto=compress,format&rect=1,0,1919,1316&w=1920&h=1317" 25 | }, 26 | work: { 27 | text_one: "Great turbulent clouds cosmic ocean cosmos globular star cluster hydrogen atoms gathered by gravity. How far away as a patch of light how far away made in the interiors of collapsing stars extraplanetary a very small stage in a vast cosmic arena. Concept of the number one billions upon billions encyclopaedia galactica encyclopaedia galactic are creatures of the cosmos rich in heavy atoms.", 28 | text_two: "illusions", 29 | text_three: "Permanence of the stars great turbulent clouds Flatland Cambrian explosion paroxysm of global death Vangelis. Colonies realm of the galaxies vastness is bearable only through love emerged into consciousness intelligent beings shores of the cosmic ocean. Hearts of the stars the carbon in our apple pies vastness is bearable only through love muse about something incredible is waiting to be known encyclopaedia galactica? Emerged into consciousness the ash of stellar alchemy a still more glorious dawn awaits a still more glorious dawn awaits courage of our questions star stuff harvesting star light?" 30 | }, 31 | extra: "https://images.prismic.io/alioth/f90ac50c-7539-4d30-a04b-36a1cd806798_illusion_6.jpg?auto=compress,format&rect=1,0,1919,1316&w=1920&h=1317", 32 | picsTwo: { 33 | 1: "https://images.prismic.io/alioth/e1c0d4c6-53ff-41a4-8f0e-e52805aea097_illusion_8.jpg?auto=compress,format", 34 | 2: "https://images.prismic.io/alioth/571b4aef-be26-4ea5-a730-1b35c12969de_illusion_9.jpg?auto=compress,format", 35 | 3: "https://images.prismic.io/alioth/3291817f-bd4f-4a25-844d-9e6245b2ccbb_illusion_10.jpg?auto=compress,format", 36 | 4: "https://images.prismic.io/alioth/f5931041-86a9-4cb9-8c88-4fe4a6215bae_illusion_11.jpg?auto=compress,format", 37 | 5: "https://images.prismic.io/alioth/e6d6beae-b294-478f-8309-29c0836fdc82_illusion_7.jpg?auto=compress,format", 38 | }, 39 | next: { 40 | pic: "https://images.prismic.io/alioth/c7cbf9eb-2fa7-4820-a924-0a6203e12426_8.jpg?auto=compress,format", 41 | title: "Pierre", 42 | id: "pierre" 43 | } 44 | }) 45 | -------------------------------------------------------------------------------- /views/pages/works/the_secrets.pug: -------------------------------------------------------------------------------- 1 | extends ../../base.pug 2 | include ./work.pug 3 | 4 | block variables 5 | - var template = 'work' 6 | 7 | block body 8 | +template({ 9 | id: "the_secrets", 10 | banner: { 11 | pic: "https://images.prismic.io/alioth/50624eb8-7e3e-4975-bc7b-91c926f96795_2.jpg?auto=compress,format", 12 | title: "The Secrets", 13 | role: "Art Direction", 14 | }, 15 | info: { 16 | date: "Route NY - 2019", 17 | text: "Made in the interiors of collapsing stars muse about encyclopaedia galactica emerged into consciousness ship of the imagination as a patch of light. From which we spring hearts of the stars the only home we've ever known concept of the number one vastness is bearable only through love rings of Uranus? Great turbulent clouds not a sunrise." 18 | }, 19 | picsOne: { 20 | 1: "https://images.prismic.io/alioth/3d419701-0bc0-4d62-882b-487379e7f4d0_secret_1.jpg?auto=compress,format", 21 | 2: "https://images.prismic.io/alioth/afc57af0-75ef-46d0-924f-5c597311bb90_secret_2.jpg?auto=compress,format", 22 | 3: "https://images.prismic.io/alioth/481d14d4-0179-49e5-9926-07c5a1ab6fb9_secret_3.jpg?auto=compress,format", 23 | 4: "https://images.prismic.io/alioth/7cde891e-378c-4ea5-9b48-7d6e92e888d8_secret_4.jpg?auto=compress,format" 24 | }, 25 | work: { 26 | text_one: "Great turbulent clouds cosmic ocean cosmos globular star cluster hydrogen atoms gathered by gravity. How far away as a patch of light how far away made in the interiors of collapsing stars extraplanetary a very small stage in a vast cosmic arena. Concept of the number one billions upon billions encyclopaedia galactica encyclopaedia galactic are creatures of the cosmos rich in heavy atoms.", 27 | text_two: "Secrets", 28 | text_three: "Encyclopaedia galactica cosmic fugue corpus callosum the ash of stellar alchemy tingling of the spine explorations. Euclid white dwarf the sky calls to us hydrogen atoms emerged into consciousness extraordinary claims require extraordinary evidence? Paroxysm of global death citizens of distant epochs Sea of Tranquility a very small stage in a vast cosmic arena emerged into consciousness a still more glorious dawn awaits." 29 | }, 30 | extra: "https://images.prismic.io/alioth/757452f5-745d-4260-8328-cb14d581ea4e_secret_5.jpg?auto=compress,format", 31 | picsTwo: { 32 | 1: "https://images.prismic.io/alioth/56fb8056-eecd-4af1-9e06-e3727293dfe2_secret_6.jpg?auto=compress,format", 33 | 2: "https://images.prismic.io/alioth/dde33549-9579-49fd-966f-b955cd0defb3_secret_7.jpg?auto=compress,format", 34 | }, 35 | next: { 36 | pic: "https://images.prismic.io/alioth/ac17c5b5-4c5f-42d2-9472-235acdad2acf_1.jpg?auto=compress,format", 37 | title: "Spirits of illusion", 38 | id: "spirits_of_illusion" 39 | } 40 | }) 41 | -------------------------------------------------------------------------------- /views/pages/works/the_silks.pug: -------------------------------------------------------------------------------- 1 | extends ../../base.pug 2 | include ./work.pug 3 | 4 | block variables 5 | - var template = 'work' 6 | 7 | block body 8 | +template({ 9 | id: "the_silks", 10 | banner: { 11 | pic: "https://images.prismic.io/alioth/9e503936-1f7d-4d78-bd91-ff35108f0121_silk_banner.jpg?auto=compress,format", 12 | title: "The Silks", 13 | role: "Branding", 14 | }, 15 | info: { 16 | date: "Naila - 2017", 17 | text: "From which we spring not a sunrise but a galaxyrise across the centuries Tunguska event Euclid descended from astronomers? Muse about emerged into consciousness vanquish the impossible the sky calls to us Orion's sword venture. Astonishment rings of Uranus stirred by starlight venture two ghostly white figures in coveralls and helmets." 18 | }, 19 | picsOne: { 20 | 1: "https://images.prismic.io/alioth/43b30cb5-51fd-46be-a580-51d7e8b3d242_silk_1.jpg?auto=compress,format", 21 | 2: "https://images.prismic.io/alioth/df832f28-b809-4d3e-a98c-0fbb31adb1da_silk_2.jpg?auto=compress,format", 22 | 3: "https://images.prismic.io/alioth/4c739159-da16-46c1-a4c0-0cac665d9685_silk_4.webp?auto=compress,format", 23 | 4: "https://images.prismic.io/alioth/ccf40333-264e-4ee9-950e-3bc1f55a3801_rainbow_4.webp?auto=compress,format" 24 | }, 25 | work: { 26 | text_one: "Citizens of distant epochs stirred by starlight white dwarf Sea of Tranquility a still more glorious dawn awaits tendrils of gossamer clouds? Extraordinary claims require extraordinary evidence something incredible is waiting to be known prime number prime number at the edge of forever two ghostly white figures in coveralls and helmets are softly dancing. Two ghostly white figures in coveralls and helmets are softly dancing great turbulent clouds muse about with pretty stories for which there's little good evidence take root and flourish a mote of dust suspended in a sunbeam.", 27 | text_two: "Patch of Light", 28 | text_three: "Culture colonies explorations emerged into consciousness across the centuries venture. Dream of the mind's eye Jean-François Champollion something incredible is waiting to be known circumnavigated stirred by starlight how far away. Finite but unbounded great turbulent clouds two ghostly white figures in coveralls and helmets are softly dancing how far away gathered by gravity courage of our questions." 29 | }, 30 | extra: "https://images.prismic.io/alioth/e15fe41c-0bb2-4505-8fbd-f385d0f287b7_silk_5.jpg?auto=compress,format", 31 | picsTwo: { 32 | 1: "https://images.prismic.io/alioth/9f23e107-385b-45b6-afb2-8189eef15d6c_silk_6.jpg?auto=compress,format", 33 | 2: "https://images.prismic.io/alioth/ed9db9ef-74cd-436c-ac57-3e1022c395f6_silk_7.jpg?auto=compress,format" 34 | }, 35 | next: { 36 | pic: "https://images.prismic.io/alioth/6031400f-2683-47d6-85b9-526fdadf6797_5.jpg?auto=compress,format", 37 | title: "Rainbows", 38 | id: "rainbows" 39 | } 40 | }) 41 | -------------------------------------------------------------------------------- /views/pages/works/work.pug: -------------------------------------------------------------------------------- 1 | mixin template({id, banner, info, picsOne, work, extra, picsTwo, next}) 2 | .work(data-background="" data-color="") 3 | canvas.webgl-container 4 | //- Scroll wrapper 5 | .work__wrapper 6 | .work__banner 7 | .work__banner__bg__wrapper 8 | figure.work__banner__picture__wrapper 9 | img.work__banner__picture.parallax__image(data-src=`${banner.pic}`, alt="IMAGE" crossorigin="anonymous") 10 | .work__banner__titles__wrapper 11 | h1.work__banner__title.splitter=banner.title 12 | h4.work__banner__role.splitter=banner.role 13 | //- info 14 | .work__info__wrapper 15 | .work__info__wrapper__inner 16 | .work__info__left 17 | p.work__info__text(data-animation="paragraph")= info.date 18 | .work__info__right 19 | p.work__info__text(data-animation="paragraph")= info.text 20 | //- Main Pictures 21 | .work__pictures__wrapper 22 | .work__pictures__wrapper__inner 23 | //- from server 24 | each link in picsOne 25 | figure.work__picture__wrapper 26 | img.work__picture.parallax__image(data-src=`${link}`, alt="IMAGE" crossorigin="anonymous") 27 | //- Content 28 | .work__content__wrapper 29 | .work__content__wrapper__inner 30 | p.work__content__text(data-animation="paragraph")= work.text_one 31 | //- work screen 32 | .work__screen__wrapper 33 | figure.work__screen__wrapper__inner 34 | img.work__screen__picture.parallax__image(data-src=`${extra}`, alt="Image") 35 | 36 | //- info-2 37 | .work__info__wrapper 38 | .work__info__wrapper__inner 39 | .work__info__left 40 | p.work__info__text(data-animation="paragraph")= work.text_two 41 | .work__info__right 42 | p.work__info__text(data-animation="paragraph")= work.text_three 43 | 44 | //- Main Pictures 2 45 | .work__pictures__wrapper 46 | .work__pictures__wrapper__inner 47 | each link in picsTwo 48 | figure.work__picture__wrapper 49 | img.work__picture.parallax__image(data-src=`${link}`, alt="IMAGE" crossorigin="anonymous") 50 | 51 | //- next section 52 | .work__next__wrapper 53 | figure.work__next__bg__wrapper 54 | img.work__next__bg__picture.parallax__image(data-src=`${next.pic}`, alt="IMAGE") 55 | .work__next__wrapper__inner 56 | h6.work__next__title(data-animation="paragraph") Next Project 57 | a.work__next__btn(href=`/works/${next.id}` data-animation="paragraph")= next.title 58 | 59 | include ../../partials/footer 60 | -------------------------------------------------------------------------------- /views/partials/footer.pug: -------------------------------------------------------------------------------- 1 | footer.footer__wrapper 2 | a.footer__content__tail__wrapper(href="/") 3 | p.footer__content__tail Contact Us 4 | .footer__content__wrapper 5 | .footer__content__inner__wrapper 6 | .footer__content__left__side 7 | a.footer__content__logo__btn(href="/" data-animation="paragraph") EVIL-STUDIO 8 | p.footer__content__logo__copyright(data-animation="paragraph") ©2022 9 | .footer__content__right__side 10 | ul.footer__link__list 11 | li.footer__link__list__item 12 | a.footer__link(href="/" data-animation="paragraph") Facebook 13 | li.footer__link__list__item 14 | a.footer__link(href="/" data-animation="paragraph") Instagram 15 | li.footer__link__list__item 16 | a.footer__link(href="/" data-animation="paragraph") Twitter 17 | li.footer__link__list__item 18 | a.footer__link(href="/" data-animation="paragraph") Linkdin 19 | li.footer__link__list__item 20 | a.footer__link(href="/" data-animation="paragraph") Behance 21 | ul.footer__list 22 | li.footer__list__item 23 | p.footer__list__paragraph(data-animation="paragraph") #15–7015 Tranmere Dr 24 | p.footer__list__paragraph(data-animation="paragraph") Mississauga, ON L5S 1T7 25 | p.footer__list__paragraph(data-animation="paragraph") +1 985 256 98 98 26 | 27 | .footer__content__cr 28 | p.footer__content__cr__text ©Copyright 2019-2026 Reserved by Evil-Studio 29 | p.footer__content__cr__text Design & Code by : #[a.footer__content__cr__link(href="https://github.com/MAGGIx1404" target="_blank") @Maggi] 30 | -------------------------------------------------------------------------------- /views/partials/navigation.pug: -------------------------------------------------------------------------------- 1 | nav.navigation#navigation 2 | .container 3 | a.logo#logo(href="/") Evil Studio 4 | .nav__links 5 | .magnet 6 | a.nav__btn.active(href="/") Home 7 | .magnet 8 | a.nav__btn(href="/about") About 9 | .magnet 10 | a.nav__btn(href="/portfolio") Portfolio 11 | .magnet 12 | a.nav__btn(href="/contact") Contact 13 | button.hamb__btn 14 | .dot 15 | .dot 16 | .dot 17 | 18 | .hamb__menu 19 | .hamb__menu__inner 20 | a.hamb__menu__link.splitter(href="/") Home 21 | a.hamb__menu__link.splitter(href="/about") About Us 22 | a.hamb__menu__link.splitter(href="/portfolio") Portfolio 23 | a.hamb__menu__link.splitter(href="/contact") Contact 24 | -------------------------------------------------------------------------------- /views/partials/preloader.pug: -------------------------------------------------------------------------------- 1 | .preloader 2 | .preloader__wrapper 3 | .preloader__line 4 | p.preloader__text 5 | span.preloader__text__span E 6 | .preloader__line 7 | p.preloader__text 8 | span.preloader__text__span V 9 | .preloader__line 10 | p.preloader__text 11 | span.preloader__text__span I 12 | .preloader__line 13 | p.preloader__text 14 | span.preloader__text__span L 15 | .preloader__line 16 | p.preloader__text 17 | span.preloader__text__span S 18 | .preloader__line 19 | p.preloader__text 20 | span.preloader__text__span T 21 | .preloader__line 22 | p.preloader__text 23 | span.preloader__text__span U 24 | .preloader__line 25 | p.preloader__text 26 | span.preloader__text__span D 27 | .preloader__line 28 | p.preloader__text 29 | span.preloader__text__span I 30 | .preloader__line 31 | p.preloader__text 32 | span.preloader__text__span O 33 | .preloader__number 34 | .preloader__number__text 0% 35 | 36 | .overlay 37 | .overlay__line 38 | .overlay__line 39 | .overlay__line 40 | .overlay__line 41 | .overlay__line 42 | .overlay__line 43 | .overlay__line 44 | .overlay__line 45 | .overlay__line 46 | .overlay__line 47 | -------------------------------------------------------------------------------- /webpack.config.build.js: -------------------------------------------------------------------------------- 1 | const path = require("path"); 2 | 3 | const { CleanWebpackPlugin } = require("clean-webpack-plugin"); 4 | 5 | const { merge } = require("webpack-merge"); 6 | const config = require("./webpack.config"); 7 | 8 | module.exports = merge(config, { 9 | mode: "production", 10 | 11 | output: { 12 | path: path.join(__dirname, "public") 13 | }, 14 | 15 | plugins: [new CleanWebpackPlugin()] 16 | }); 17 | -------------------------------------------------------------------------------- /webpack.config.development.js: -------------------------------------------------------------------------------- 1 | const { merge } = require("webpack-merge"); 2 | const path = require("path"); 3 | const config = require("./webpack.config"); 4 | 5 | module.exports = merge(config, { 6 | mode: "development", 7 | devtool: "inline-source-map", 8 | output: { 9 | path: path.resolve(__dirname, "public") 10 | } 11 | }); 12 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require("path"); 2 | const webpack = require("webpack"); 3 | const CopyWebpackPlugin = require("copy-webpack-plugin"); 4 | const MiniCssExtractPlugin = require("mini-css-extract-plugin"); 5 | const IS_DEVELOPMENT = process.env.NODE_ENV === "dev"; 6 | const dirApp = path.join(__dirname, "app"); 7 | const dirAssets = path.join(__dirname, "assets"); 8 | const dirStyles = path.join(__dirname, "styles"); 9 | const dirNode = "node_modules"; 10 | 11 | module.exports = { 12 | entry: [path.join(dirApp, "index.js"), path.join(dirStyles, "index.scss")], 13 | 14 | resolve: { 15 | modules: [dirApp, dirAssets, dirNode] 16 | }, 17 | 18 | plugins: [ 19 | new webpack.DefinePlugin({ 20 | IS_DEVELOPMENT 21 | }), 22 | 23 | new webpack.ProvidePlugin({}), 24 | 25 | new CopyWebpackPlugin({ 26 | patterns: [ 27 | { 28 | from: "./app/service-worker.js", 29 | to: "" 30 | }, 31 | { 32 | from: "./offline", 33 | to: "offline" 34 | }, 35 | { 36 | from: "./shared", 37 | to: "" 38 | } 39 | ] 40 | }), 41 | 42 | new MiniCssExtractPlugin({ 43 | filename: "[name].css", 44 | chunkFilename: "[id].css" 45 | }) 46 | ], 47 | 48 | module: { 49 | rules: [ 50 | { 51 | test: /\.pug$/, 52 | use: ["pug-loader"] 53 | }, 54 | { 55 | test: /\.js$/, 56 | use: { 57 | loader: "babel-loader" 58 | } 59 | }, 60 | { 61 | test: /\.(sa|sc|c)ss$/, 62 | use: [ 63 | { 64 | loader: MiniCssExtractPlugin.loader, 65 | options: { 66 | publicPath: "" 67 | } 68 | }, 69 | { 70 | loader: "css-loader", 71 | options: { 72 | sourceMap: false 73 | } 74 | }, 75 | { 76 | loader: "postcss-loader", 77 | options: { 78 | sourceMap: false 79 | } 80 | }, 81 | { 82 | loader: "sass-loader", 83 | options: { 84 | sourceMap: false 85 | } 86 | } 87 | ] 88 | }, 89 | { 90 | test: /\.(woff|woff2|eot|ttf|otf)$/i, 91 | type: "asset/resource" 92 | }, 93 | { 94 | test: /\.(png|svg|jpg|jpeg|gif)$/i, 95 | type: "asset/resource" 96 | } 97 | ] 98 | } 99 | }; 100 | --------------------------------------------------------------------------------