├── .npmignore ├── website ├── styles │ ├── _font-style.scss │ ├── _themes.scss │ ├── _colors.scss │ ├── _fonts.scss │ ├── _utils.scss │ ├── _scroll.scss │ ├── _spacers.scss │ ├── _easings.scss │ ├── global.scss │ ├── _functions.scss │ ├── _layout.scss │ └── _reset.scss ├── .npmrc ├── .prettierrc ├── libs │ ├── orchestra │ │ ├── orchestra.module.scss │ │ ├── grid │ │ │ ├── grid.module.scss │ │ │ └── index.js │ │ ├── stats │ │ │ └── index.js │ │ └── index.js │ ├── analytics.js │ ├── store.js │ ├── slugify.js │ ├── zustand-broadcast.js │ ├── maths.js │ ├── sass-utils │ │ ├── util.js │ │ └── index.js │ └── theatre │ │ ├── studio │ │ ├── studio.module.scss │ │ └── index.js │ │ ├── hooks │ │ ├── use-studio.js │ │ └── use-theatre.js │ │ ├── r3f.js │ │ └── index.js ├── public │ ├── favicon.ico │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── apple-touch-icon.png │ ├── mstile-150x150.png │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ ├── robots.txt │ ├── sitemap.xml │ ├── config │ │ └── Satus-2023-04-17T12_55_21.json │ ├── manifest.json │ ├── site.webmanifest │ ├── sitemap-0.xml │ └── safari-pinned-tab.svg ├── .prettierignore ├── next-sitemap.config.js ├── pages │ ├── _debug │ │ └── orchestra │ │ │ └── index.js │ ├── index.js │ ├── home │ │ ├── home.module.scss │ │ └── index.js │ ├── _document.js │ └── _app.js ├── components │ ├── footer │ │ ├── footer.module.scss │ │ └── index.js │ ├── navigation │ │ ├── navigation.module.scss │ │ └── index.js │ ├── header │ │ ├── header.module.scss │ │ └── index.js │ └── device-detection │ │ └── index.js ├── .eslintrc.json ├── layouts │ └── default │ │ ├── layout.module.scss │ │ └── index.js ├── .gitignore ├── config │ └── variables.js ├── jsconfig.json ├── hooks │ └── use-ready-state.js ├── package.json └── next.config.js ├── pnpm-workspace.yaml ├── .prettierrc ├── src ├── media │ ├── video │ │ ├── video.module.scss │ │ └── index.js │ ├── lottie │ │ ├── lottie.module.scss │ │ └── index.js │ ├── image │ │ └── index.js │ └── index.js ├── slider │ ├── slider.module.scss │ ├── docs.md │ └── index.js ├── marquee-scroll │ ├── marquee-scroll.module.scss │ └── index.js ├── grid-debugger │ ├── docs.md │ ├── grid-debugger.module.scss │ └── index.js ├── parallax │ ├── docs.md │ └── index.js ├── sticky │ ├── docs.md │ └── index.js ├── isomorphic │ └── index.js ├── select │ ├── docs.md │ └── index.js ├── stats │ └── index.js ├── cursor │ ├── cursor.module.scss │ └── index.js ├── transparent-video │ ├── transparent-video.module.scss │ └── index.js ├── real-viewport │ └── index.js ├── accordion │ ├── accordion.module.scss │ ├── doc.md │ └── index.js ├── scrollbar │ ├── scrollbar.module.scss │ └── index.js ├── kinesis │ └── index.js ├── marquee │ ├── marquee.module.scss │ └── index.js ├── index.js ├── _functions.scss ├── link │ └── index.js ├── custom-head │ └── index.js └── page-transition │ └── index.js ├── .eslintrc.json ├── .gitignore ├── lib ├── slugify.js └── maths.js ├── package.json └── README.md /.npmignore: -------------------------------------------------------------------------------- 1 | /website -------------------------------------------------------------------------------- /website/styles/_font-style.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /website/.npmrc: -------------------------------------------------------------------------------- 1 | auto-install-peers=false -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - 'src/*' 3 | - 'website' 4 | -------------------------------------------------------------------------------- /website/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "endOfLine": "auto", 3 | "semi": false, 4 | "singleQuote": true 5 | } 6 | -------------------------------------------------------------------------------- /website/libs/orchestra/orchestra.module.scss: -------------------------------------------------------------------------------- 1 | .orchestra { 2 | button { 3 | font-size: 64px; 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /website/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/darkroomengineering/compono/HEAD/website/public/favicon.ico -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 120, 3 | "endOfLine": "auto", 4 | "semi": false, 5 | "singleQuote": true 6 | } 7 | -------------------------------------------------------------------------------- /website/public/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/darkroomengineering/compono/HEAD/website/public/favicon-16x16.png -------------------------------------------------------------------------------- /website/public/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/darkroomengineering/compono/HEAD/website/public/favicon-32x32.png -------------------------------------------------------------------------------- /website/public/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/darkroomengineering/compono/HEAD/website/public/apple-touch-icon.png -------------------------------------------------------------------------------- /website/public/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/darkroomengineering/compono/HEAD/website/public/mstile-150x150.png -------------------------------------------------------------------------------- /website/.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | **/.next/** 3 | **/dist/** 4 | **/public/** 5 | .github/** 6 | .vercel/** 7 | .husky/** 8 | pnpm-lock.yaml -------------------------------------------------------------------------------- /website/public/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/darkroomengineering/compono/HEAD/website/public/android-chrome-192x192.png -------------------------------------------------------------------------------- /website/public/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/darkroomengineering/compono/HEAD/website/public/android-chrome-512x512.png -------------------------------------------------------------------------------- /website/next-sitemap.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | siteUrl: process.env.WEBSITE_URL || 'https://example.com', 3 | generateRobotsTxt: true, // (optional) 4 | } 5 | -------------------------------------------------------------------------------- /website/pages/_debug/orchestra/index.js: -------------------------------------------------------------------------------- 1 | import { OrchestraToggle } from 'libs/orchestra' 2 | 3 | export default function Orchestra() { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /website/pages/index.js: -------------------------------------------------------------------------------- 1 | import home, { getStaticProps as homeGetStaticProps } from './home' 2 | 3 | export const getStaticProps = homeGetStaticProps 4 | 5 | export default home 6 | -------------------------------------------------------------------------------- /website/public/robots.txt: -------------------------------------------------------------------------------- 1 | # * 2 | User-agent: * 3 | Allow: / 4 | 5 | # Host 6 | Host: https://example.com 7 | 8 | # Sitemaps 9 | Sitemap: https://example.com/sitemap.xml 10 | -------------------------------------------------------------------------------- /website/public/sitemap.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | https://example.com/sitemap-0.xml 4 | -------------------------------------------------------------------------------- /src/media/video/video.module.scss: -------------------------------------------------------------------------------- 1 | .video { 2 | position: absolute; 3 | height: 100%; 4 | width: 100%; 5 | left: 0; 6 | top: 0; 7 | right: 0; 8 | bottom: 0; 9 | object-fit: cover; 10 | color: transparent; 11 | } 12 | -------------------------------------------------------------------------------- /src/media/lottie/lottie.module.scss: -------------------------------------------------------------------------------- 1 | .lottie { 2 | position: absolute; 3 | height: 100%; 4 | width: 100%; 5 | left: 0; 6 | top: 0; 7 | right: 0; 8 | bottom: 0; 9 | object-fit: cover; 10 | color: transparent; 11 | } 12 | -------------------------------------------------------------------------------- /src/slider/slider.module.scss: -------------------------------------------------------------------------------- 1 | .slider { 2 | &:global(.is-draggable) { 3 | cursor: grab; 4 | } 5 | 6 | &:global(.is-dragging) { 7 | cursor: grabbing; 8 | } 9 | } 10 | 11 | .container { 12 | display: flex; 13 | } 14 | -------------------------------------------------------------------------------- /website/components/footer/footer.module.scss: -------------------------------------------------------------------------------- 1 | .footer { 2 | color: var(--theme-primary); 3 | background-color: var(--theme-secondary); 4 | padding: mobile-vw(20px) 0; 5 | 6 | @include desktop { 7 | padding: desktop-vw(40px) 0; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/marquee-scroll/marquee-scroll.module.scss: -------------------------------------------------------------------------------- 1 | .marquee { 2 | display: flex; 3 | overflow: hidden; 4 | will-change: transform; 5 | 6 | .inner { 7 | display: flex; 8 | white-space: nowrap; 9 | transform: translate3d(var(--marquee-progress), 0, 0); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /website/styles/_themes.scss: -------------------------------------------------------------------------------- 1 | @use 'sass:color'; 2 | 3 | @each $name, $theme in getThemes() { 4 | .theme-#{$name} { 5 | @each $name, $color in $theme { 6 | --theme-#{$name}: #{$color}; 7 | --theme-#{$name}-transparent: #{color.change($color, $alpha: 0)}; 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /website/libs/analytics.js: -------------------------------------------------------------------------------- 1 | export const GTM_ID = process.env.NEXT_PUBLIC_GOOGLE_TAG_MANAGER_ID || '' 2 | export const GA_ID = process.env.NEXT_PUBLIC_GOOGLE_ANALYTICS || '' 3 | 4 | export const pageview = (url) => { 5 | window.dataLayer.push({ 6 | event: 'pageview', 7 | page: url, 8 | }) 9 | } 10 | -------------------------------------------------------------------------------- /src/grid-debugger/docs.md: -------------------------------------------------------------------------------- 1 | # Grid Debugger 2 | 3 | ## Usage 4 | 5 | Make sure the grid is added in `` component, in order to match the grid to the design you need to add `` elements accordingly, and then edit the css grid and spacing. 6 | 7 | ## Example 8 | 9 | ```javascript 10 | 11 | ``` 12 | -------------------------------------------------------------------------------- /website/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["next/core-web-vitals", "prettier"], 3 | "ignorePatterns": ["**/public/*.js"], 4 | "rules": { 5 | "no-unused-vars": "error", 6 | "react/no-unescaped-entities": "off", 7 | "@next/next/no-img-element": "off", 8 | "react-hooks/exhaustive-deps": "off" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /website/layouts/default/layout.module.scss: -------------------------------------------------------------------------------- 1 | .layout { 2 | background-color: var(--theme-primary); 3 | color: var(--theme-secondary); 4 | min-height: 100vh; 5 | display: flex; 6 | flex-direction: column; 7 | 8 | .main { 9 | // if content is empty, footer will remains sticky to bottom 10 | flex-grow: 1; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /website/styles/_colors.scss: -------------------------------------------------------------------------------- 1 | @use 'sass:color'; 2 | 3 | :root { 4 | @each $name, $color in getColors() { 5 | --#{$name}: #{$color}; 6 | // // for safari use case: https://ambientimpact.com/web/snippets/safari-bug-with-gradients-that-fade-to-transparent 7 | --#{$name}-transparent: #{color.change($color, $alpha: 0)}; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /website/styles/_fonts.scss: -------------------------------------------------------------------------------- 1 | // HERE WE DEFINE FONT-FACES, I.E.: 2 | // @font-face { 3 | // font-family: 'Attila Sans Uniform'; 4 | // src: url('/fonts/Attila/AttilaSansUniform-Black.woff2') format('woff2'), 5 | // url('/fonts/Attila/AttilaSansUniform-Black.woff') format('woff'); 6 | // font-display: swap; 7 | // font-weight: 900; 8 | // } 9 | -------------------------------------------------------------------------------- /website/public/config/Satus-2023-04-17T12_55_21.json: -------------------------------------------------------------------------------- 1 | {"sheetsById":{"Home":{"staticOverrides":{"byObject":{"hero":{"x":100}}},"sequence":{"subUnitsPerUnit":30,"length":10,"type":"PositionalSequence","tracksByObject":{"hero":{"trackData":{},"trackIdByPropPath":{}}}}}},"definitionVersion":"0.4.0","revisionHistory":["I-OXpYz2ws43RtvD","eIt4Qgn0WuMGIFoa","PwzRTTw3U5z64-ij"]} -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["next/core-web-vitals", "prettier"], 3 | "ignorePatterns": ["**/public/*.js"], 4 | "rules": { 5 | "no-unused-vars": "error", 6 | "react/no-unknown-property": "off", 7 | "react/no-unescaped-entities": "off", 8 | "@next/next/no-img-element": "off", 9 | "react-hooks/exhaustive-deps": "off" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/parallax/docs.md: -------------------------------------------------------------------------------- 1 | Parallax uses GSAP ScrollTrigger under the hood. 2 | 3 | speed: parallax speed relative to viewport width. 4 | position: use 'top' if element is visible on first screen of your page. 5 | 6 | ```javascript 7 | import { Parallax } from 'components/parallax' 8 | 9 | return ( 10 | 11 |
12 |
13 | ) 14 | ``` 15 | -------------------------------------------------------------------------------- /website/components/navigation/navigation.module.scss: -------------------------------------------------------------------------------- 1 | .navigation { 2 | height: 0; 3 | background-color: green; 4 | position: absolute; 5 | top: 0; 6 | left: 0; 7 | width: 100%; 8 | height: 100vh; 9 | overflow-y: scroll; 10 | 11 | &.closed { 12 | pointer-events: none; 13 | display: none; 14 | 15 | > * { 16 | opacity: 0; 17 | } 18 | } 19 | 20 | .content { 21 | height: 500vh; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | bundled 13 | dist-ssr 14 | *.local 15 | .parcel-cache 16 | .eslintcache 17 | 18 | # Editor directories and files 19 | .vscode/* 20 | !.vscode/extensions.json 21 | .idea 22 | .DS_Store 23 | *.suo 24 | *.ntvs* 25 | *.njsproj 26 | *.sln 27 | *.sw? 28 | 29 | # next 30 | .next 31 | -------------------------------------------------------------------------------- /website/components/header/header.module.scss: -------------------------------------------------------------------------------- 1 | .header { 2 | position: fixed; 3 | top: 0; 4 | left: 0; 5 | width: 100%; 6 | z-index: 1; 7 | // color: var(--white); 8 | color: var(--theme-secondary); 9 | padding: mobile-vw(20px) 0; 10 | 11 | @include desktop { 12 | padding: desktop-vw(40px) 0; 13 | } 14 | 15 | .head { 16 | display: flex; 17 | justify-content: space-between; 18 | position: relative; 19 | z-index: 2; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/sticky/docs.md: -------------------------------------------------------------------------------- 1 | Sticky uses GSAP ScrollTrigger under the hood. 2 | docs: https://greensock.com/docs/v3/Plugins/ScrollTrigger 3 | 4 | start: pixel distance to viewport top. 5 | end: pixel distance to parent element bottom. 6 | target: element to be sticky, direct parent by default. 7 | pinType: 'fixed' or 'transform'. 'fixed' by default. 8 | 9 | ```javascript 10 | import { Sticky } from 'components/sticky' 11 | ; 12 |
13 |
14 | ``` 15 | -------------------------------------------------------------------------------- /website/libs/store.js: -------------------------------------------------------------------------------- 1 | import { create } from 'zustand' 2 | 3 | export const useStore = create((set) => ({ 4 | headerData: undefined, 5 | setHeaderData: (headerData) => set({ headerData }), 6 | footerData: undefined, 7 | setFooterData: (footerData) => set({ footerData }), 8 | navIsOpened: false, 9 | setNavIsOpened: (value) => set({ navIsOpened: value }), 10 | triggerTransition: false, 11 | setTriggerTransition: (triggerTransition) => set({ triggerTransition }), 12 | })) 13 | -------------------------------------------------------------------------------- /website/components/footer/index.js: -------------------------------------------------------------------------------- 1 | import { Link } from '@studio-freight/compono' 2 | import s from './footer.module.scss' 3 | 4 | export function Footer() { 5 | return ( 6 |
7 |
8 |

9 | mail 10 | contact 11 | twitter 12 |

13 |
14 |
15 | ) 16 | } 17 | -------------------------------------------------------------------------------- /website/libs/orchestra/grid/grid.module.scss: -------------------------------------------------------------------------------- 1 | .grid { 2 | position: fixed; 3 | top: 0; 4 | left: 0; 5 | width: 100%; 6 | height: 100vh; 7 | pointer-events: none; 8 | z-index: 10000; 9 | } 10 | 11 | .debugger { 12 | position: absolute; 13 | inset: 0; 14 | background-image: linear-gradient( 15 | 0deg, 16 | rgba(0, 0, 0, 0.1) 50%, 17 | rgba(247, 181, 68, 0.1) 50% 18 | ); 19 | background-size: 8px 8px; 20 | 21 | span { 22 | background: pink; 23 | opacity: 0.33; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /website/pages/home/home.module.scss: -------------------------------------------------------------------------------- 1 | .title { 2 | display: flex; 3 | align-items: center; 4 | justify-content: center; 5 | min-height: 100vh; 6 | 7 | .title { 8 | flex-grow: 1; 9 | } 10 | } 11 | 12 | .content { 13 | display: flex; 14 | justify-content: center; 15 | align-items: center; 16 | height: 100svh; 17 | 18 | .accordion, 19 | .accordion .content { 20 | height: 50px; 21 | } 22 | } 23 | 24 | .media { 25 | height: 100vh; 26 | width: 100%; 27 | position: relative; 28 | } 29 | -------------------------------------------------------------------------------- /src/media/video/index.js: -------------------------------------------------------------------------------- 1 | import cn from 'clsx' 2 | import s from './video.module.scss' 3 | 4 | export const Video = ({ className, src, alt = '', onLoad, ...props }) => { 5 | return ( 6 |