Created
October 20, 2023 20:06
-
-
Save natemoo-re/af5472e5c9a37b6e9790cb9c9b07920a to your computer and use it in GitHub Desktop.
Houston component
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| --- | |
| interface Props { | |
| pose?: | |
| | "default" | |
| | "happy" | |
| | "disappointed" | |
| | "shocked" | |
| | "love" | |
| | "grumpy" | |
| | "sad" | |
| | "cry" | |
| | "wink"; | |
| theme?: "default" | "mono"; | |
| glow?: boolean; | |
| } | |
| const { | |
| pose = "default", | |
| glow = false, | |
| theme = "default", | |
| } = Astro.props; | |
| --- | |
| <hey-houston | |
| class:list={{ glow, [`theme-${theme}`]: theme !== "default" }} | |
| pose={pose} | |
| > | |
| <div class="container"> | |
| <div class="body"> | |
| <div class="face"> | |
| <div class="eye" data-shape="circle"></div> | |
| <div class="mouth" data-shape="half-up"></div> | |
| <div class="eye" data-shape="circle"></div> | |
| </div> | |
| </div> | |
| </div> | |
| </hey-houston> | |
| <script> | |
| const poses = { | |
| default: "circle half-up circle", | |
| happy: "half-down half-up half-down", | |
| disappointed: "half-up bar-bottom half-up", | |
| shocked: "circle-stroke bar circle-stroke", | |
| love: "heart half-up heart", | |
| grumpy: "bar-top half-down bar-top", | |
| sad: "circle half-down-bottom circle", | |
| cry: "half-down square half-down", | |
| wink: "circle half-up bar", | |
| }; | |
| const eyes = [ | |
| "circle", | |
| "half-down", | |
| "circle-small", | |
| "circle-small", | |
| "square", | |
| "circle-stroke", | |
| ]; | |
| const mouths = [ | |
| "circle-small", | |
| "square", | |
| "square-small", | |
| "bar", | |
| "circle-small", | |
| "square-small", | |
| ]; | |
| const randBetween = (from: number, to: number) => | |
| from + Math.floor(Math.random() * to); | |
| const lerp = (start: number, end: number, amt: number) => | |
| (1 - amt) * start + amt * end; | |
| class HeyHouston extends HTMLElement { | |
| private _rect!: DOMRect; | |
| private _handle?: number; | |
| constructor() { | |
| super(); | |
| this.onPointerMove = this.onPointerMove.bind(this); | |
| this.onResize = this.onResize.bind(this); | |
| this.onResize(); | |
| } | |
| connectedCallback() { | |
| window.addEventListener("resize", this.onResize); | |
| this.addEventListener("pointermove", this.onPointerMove); | |
| } | |
| disconnectedCallback() { | |
| window.removeEventListener("resize", this.onResize); | |
| this.removeEventListener("pointermove", this.onPointerMove); | |
| } | |
| onPointerMove(event: PointerEvent) { | |
| const x = (event.clientX - this._rect.x) / this._rect.width - 0.5; | |
| const y = (event.clientY - this._rect.y) / this._rect.height - 0.5; | |
| const deltaX = 0 - x; | |
| const deltaY = 0 - y; | |
| const rad = Math.atan2(deltaY, deltaX); | |
| let deg = rad * (180 / Math.PI); | |
| deg = deg < 0 ? Math.abs(deg) : deg; | |
| this.style.setProperty("--x", `${x.toPrecision(2)}`); | |
| this.style.setProperty("--y", `${y.toPrecision(2)}`); | |
| this.style.setProperty( | |
| "--deg", | |
| `${lerp(0, -35, Math.abs(deg / 180))}deg` | |
| ); | |
| } | |
| onResize() { | |
| this._rect = this.getBoundingClientRect(); | |
| } | |
| static get observedAttributes() { | |
| return ["shapes", "pose"]; | |
| } | |
| get eye0() { | |
| return this.querySelector(".eye:first-child")! as HTMLElement; | |
| } | |
| get mouth() { | |
| return this.querySelector(".mouth")! as HTMLElement; | |
| } | |
| get eye1() { | |
| return this.querySelector(".eye:last-child")! as HTMLElement; | |
| } | |
| attributeChangedCallback(name: string, oldValue: string, newValue: string) { | |
| if (name === "shapes") { | |
| this.updateShapes(newValue); | |
| } | |
| if (name === "pose") { | |
| const shapes = poses[newValue as keyof typeof poses] ?? poses.default; | |
| this.updateShapes(shapes); | |
| } | |
| } | |
| reset() { | |
| if (this._handle) clearTimeout(this._handle); | |
| this.updateShapes( | |
| poses[(this.getAttribute("pose") as keyof typeof poses) ?? "default"] | |
| ); | |
| } | |
| updateShapes(value: string) { | |
| const [eye0, mouth, eye1] = value.split(" "); | |
| this.eye0.dataset.shape = eye0; | |
| this.mouth.dataset.shape = mouth; | |
| this.eye1.dataset.shape = eye1; | |
| } | |
| emote(name: keyof typeof poses) { | |
| const shapes = poses[name] ?? poses.default; | |
| this.updateShapes(shapes); | |
| this._handle = setTimeout(() => { | |
| this.reset(); | |
| }, randBetween(1000, 1750)); | |
| } | |
| talk() { | |
| const shapes = poses.default; | |
| this.updateShapes(shapes); | |
| let i = 0; | |
| let pace = randBetween(3, 5); | |
| const loop = () => { | |
| i++; | |
| if (i === pace) { | |
| const eye = eyes[randBetween(0, eyes.length - 1)]; | |
| this.eye0.dataset.shape = eye; | |
| this.eye1.dataset.shape = eye; | |
| pace = randBetween(3, 5); | |
| i = 0; | |
| } | |
| this.mouth.dataset.shape = mouths[randBetween(0, mouths.length - 1)]; | |
| this._handle = setTimeout(() => loop(), randBetween(100, 300)); | |
| }; | |
| loop(); | |
| return { | |
| stop: () => this.reset(), | |
| }; | |
| } | |
| think() { | |
| this.classList.add("active"); | |
| this.classList.add("loading"); | |
| return { | |
| stop: () => { | |
| this.classList.remove("loading"); | |
| }, | |
| }; | |
| } | |
| } | |
| customElements.define("hey-houston", HeyHouston); | |
| </script> | |
| <style> | |
| hey-houston { | |
| --scale: 1; | |
| --size: calc( | |
| clamp(6.25rem, calc(3.75rem + 12.5vw), 13.75rem) * var(--scale) | |
| ); | |
| --border-width: calc( | |
| clamp(0.31rem, calc(0.21rem + 0.52vw), 0.63rem) * var(--scale) | |
| ); | |
| --border-color: conic-gradient( | |
| from var(--deg, 0deg) at 50% 50%, | |
| #3245ff 0deg, | |
| #bc52ee 102deg, | |
| #4af2c8 150deg, | |
| #4af2c8 200deg, | |
| #3245ff 360deg | |
| ); | |
| --body-color: radial-gradient( | |
| 80% 80% at 50% 37.5%, | |
| #191c24 33%, | |
| #111218 67%, | |
| #040506 100% | |
| ); | |
| color: white; | |
| position: relative; | |
| aspect-ratio: 128 / 96; | |
| width: var(--size); | |
| margin-top: 6rem; | |
| transition: transform 600ms cubic-bezier(0.23, 1, 0.32, 1), margin-top 600ms cubic-bezier(0.23, 1, 0.32, 1); | |
| --border-squircle: polygon( | |
| 100% 50%, | |
| 100% 68.2%, | |
| 100% 71.6%, | |
| 100% 73.9%, | |
| 100% 75.7%, | |
| 100% 77.2%, | |
| 99.9% 78.4%, | |
| 99.9% 79.5%, | |
| 99.9% 80.5%, | |
| 99.8% 81.4%, | |
| 99.8% 82.3%, | |
| 99.8% 83%, | |
| 99.7% 83.8%, | |
| 99.7% 84.4%, | |
| 99.6% 85.1%, | |
| 99.6% 85.7%, | |
| 99.5% 86.2%, | |
| 99.4% 86.8%, | |
| 99.4% 87.3%, | |
| 99.3% 87.8%, | |
| 99.2% 88.2%, | |
| 99.1% 88.7%, | |
| 99.1% 89.1%, | |
| 99% 89.5%, | |
| 98.9% 89.9%, | |
| 98.8% 90.3%, | |
| 98.7% 90.7%, | |
| 98.6% 91%, | |
| 98.5% 91.4%, | |
| 98.4% 91.7%, | |
| 98.2% 92%, | |
| 98.1% 92.4%, | |
| 98% 92.7%, | |
| 97.8% 93%, | |
| 97.7% 93.2%, | |
| 97.6% 93.5%, | |
| 97.4% 93.8%, | |
| 97.3% 94%, | |
| 97.1% 94.3%, | |
| 96.9% 94.5%, | |
| 96.8% 94.8%, | |
| 96.6% 95%, | |
| 96.4% 95.2%, | |
| 96.2% 95.4%, | |
| 96% 95.6%, | |
| 95.9% 95.9%, | |
| 95.6% 96%, | |
| 95.4% 96.2%, | |
| 95.2% 96.4%, | |
| 95% 96.6%, | |
| 94.8% 96.8%, | |
| 94.5% 96.9%, | |
| 94.3% 97.1%, | |
| 94% 97.3%, | |
| 93.8% 97.4%, | |
| 93.5% 97.6%, | |
| 93.2% 97.7%, | |
| 93% 97.8%, | |
| 92.7% 98%, | |
| 92.4% 98.1%, | |
| 92% 98.2%, | |
| 91.7% 98.4%, | |
| 91.4% 98.5%, | |
| 91% 98.6%, | |
| 90.7% 98.7%, | |
| 90.3% 98.8%, | |
| 89.9% 98.9%, | |
| 89.5% 99%, | |
| 89.1% 99.1%, | |
| 88.7% 99.1%, | |
| 88.2% 99.2%, | |
| 87.8% 99.3%, | |
| 87.3% 99.4%, | |
| 86.8% 99.4%, | |
| 86.2% 99.5%, | |
| 85.7% 99.6%, | |
| 85.1% 99.6%, | |
| 84.4% 99.7%, | |
| 83.8% 99.7%, | |
| 83% 99.8%, | |
| 82.3% 99.8%, | |
| 81.4% 99.8%, | |
| 80.5% 99.9%, | |
| 79.5% 99.9%, | |
| 78.4% 99.9%, | |
| 77.2% 100%, | |
| 75.7% 100%, | |
| 73.9% 100%, | |
| 71.6% 100%, | |
| 68.2% 100%, | |
| 50% 100%, | |
| 31.8% 100%, | |
| 28.4% 100%, | |
| 26.1% 100%, | |
| 24.3% 100%, | |
| 22.8% 100%, | |
| 21.6% 99.9%, | |
| 20.5% 99.9%, | |
| 19.5% 99.9%, | |
| 18.6% 99.8%, | |
| 17.7% 99.8%, | |
| 17% 99.8%, | |
| 16.2% 99.7%, | |
| 15.6% 99.7%, | |
| 14.9% 99.6%, | |
| 14.3% 99.6%, | |
| 13.8% 99.5%, | |
| 13.2% 99.4%, | |
| 12.7% 99.4%, | |
| 12.2% 99.3%, | |
| 11.8% 99.2%, | |
| 11.3% 99.1%, | |
| 10.9% 99.1%, | |
| 10.5% 99%, | |
| 10.1% 98.9%, | |
| 9.7% 98.8%, | |
| 9.3% 98.7%, | |
| 9% 98.6%, | |
| 8.6% 98.5%, | |
| 8.3% 98.4%, | |
| 8% 98.2%, | |
| 7.6% 98.1%, | |
| 7.3% 98%, | |
| 7% 97.8%, | |
| 6.8% 97.7%, | |
| 6.5% 97.6%, | |
| 6.2% 97.4%, | |
| 6% 97.3%, | |
| 5.7% 97.1%, | |
| 5.5% 96.9%, | |
| 5.2% 96.8%, | |
| 5% 96.6%, | |
| 4.8% 96.4%, | |
| 4.6% 96.2%, | |
| 4.4% 96%, | |
| 4.1% 95.9%, | |
| 4% 95.6%, | |
| 3.8% 95.4%, | |
| 3.6% 95.2%, | |
| 3.4% 95%, | |
| 3.2% 94.8%, | |
| 3.1% 94.5%, | |
| 2.9% 94.3%, | |
| 2.7% 94%, | |
| 2.6% 93.8%, | |
| 2.4% 93.5%, | |
| 2.3% 93.2%, | |
| 2.2% 93%, | |
| 2% 92.7%, | |
| 1.9% 92.4%, | |
| 1.8% 92%, | |
| 1.6% 91.7%, | |
| 1.5% 91.4%, | |
| 1.4% 91%, | |
| 1.3% 90.7%, | |
| 1.2% 90.3%, | |
| 1.1% 89.9%, | |
| 1% 89.5%, | |
| 0.9% 89.1%, | |
| 0.9% 88.7%, | |
| 0.8% 88.2%, | |
| 0.7% 87.8%, | |
| 0.6% 87.3%, | |
| 0.6% 86.8%, | |
| 0.5% 86.2%, | |
| 0.4% 85.7%, | |
| 0.4% 85.1%, | |
| 0.3% 84.4%, | |
| 0.3% 83.8%, | |
| 0.2% 83%, | |
| 0.2% 82.3%, | |
| 0.2% 81.4%, | |
| 0.1% 80.5%, | |
| 0.1% 79.5%, | |
| 0.1% 78.4%, | |
| 0% 77.2%, | |
| 0% 75.7%, | |
| 0% 73.9%, | |
| 0% 71.6%, | |
| 0% 68.2%, | |
| 0% 50%, | |
| 0% 31.8%, | |
| 0% 28.4%, | |
| 0% 26.1%, | |
| 0% 24.3%, | |
| 0% 22.8%, | |
| 0.1% 21.6%, | |
| 0.1% 20.5%, | |
| 0.1% 19.5%, | |
| 0.2% 18.6%, | |
| 0.2% 17.7%, | |
| 0.2% 17%, | |
| 0.3% 16.2%, | |
| 0.3% 15.6%, | |
| 0.4% 14.9%, | |
| 0.4% 14.3%, | |
| 0.5% 13.8%, | |
| 0.6% 13.2%, | |
| 0.6% 12.7%, | |
| 0.7% 12.2%, | |
| 0.8% 11.8%, | |
| 0.9% 11.3%, | |
| 0.9% 10.9%, | |
| 1% 10.5%, | |
| 1.1% 10.1%, | |
| 1.2% 9.7%, | |
| 1.3% 9.3%, | |
| 1.4% 9%, | |
| 1.5% 8.6%, | |
| 1.6% 8.3%, | |
| 1.8% 8%, | |
| 1.9% 7.6%, | |
| 2% 7.3%, | |
| 2.2% 7%, | |
| 2.3% 6.8%, | |
| 2.4% 6.5%, | |
| 2.6% 6.2%, | |
| 2.7% 6%, | |
| 2.9% 5.7%, | |
| 3.1% 5.5%, | |
| 3.2% 5.2%, | |
| 3.4% 5%, | |
| 3.6% 4.8%, | |
| 3.8% 4.6%, | |
| 4% 4.4%, | |
| 4.1% 4.1%, | |
| 4.4% 4%, | |
| 4.6% 3.8%, | |
| 4.8% 3.6%, | |
| 5% 3.4%, | |
| 5.2% 3.2%, | |
| 5.5% 3.1%, | |
| 5.7% 2.9%, | |
| 6% 2.7%, | |
| 6.2% 2.6%, | |
| 6.5% 2.4%, | |
| 6.8% 2.3%, | |
| 7% 2.2%, | |
| 7.3% 2%, | |
| 7.6% 1.9%, | |
| 8% 1.8%, | |
| 8.3% 1.6%, | |
| 8.6% 1.5%, | |
| 9% 1.4%, | |
| 9.3% 1.3%, | |
| 9.7% 1.2%, | |
| 10.1% 1.1%, | |
| 10.5% 1%, | |
| 10.9% 0.9%, | |
| 11.3% 0.9%, | |
| 11.8% 0.8%, | |
| 12.2% 0.7%, | |
| 12.7% 0.6%, | |
| 13.2% 0.6%, | |
| 13.8% 0.5%, | |
| 14.3% 0.4%, | |
| 14.9% 0.4%, | |
| 15.6% 0.3%, | |
| 16.2% 0.3%, | |
| 17% 0.2%, | |
| 17.7% 0.2%, | |
| 18.6% 0.2%, | |
| 19.5% 0.1%, | |
| 20.5% 0.1%, | |
| 21.6% 0.1%, | |
| 22.8% 0%, | |
| 24.3% 0%, | |
| 26.1% 0%, | |
| 28.4% 0%, | |
| 31.8% 0%, | |
| 50% 0%, | |
| 68.2% 0%, | |
| 71.6% 0%, | |
| 73.9% 0%, | |
| 75.7% 0%, | |
| 77.2% 0%, | |
| 78.4% 0.1%, | |
| 79.5% 0.1%, | |
| 80.5% 0.1%, | |
| 81.4% 0.2%, | |
| 82.3% 0.2%, | |
| 83% 0.2%, | |
| 83.8% 0.3%, | |
| 84.4% 0.3%, | |
| 85.1% 0.4%, | |
| 85.7% 0.4%, | |
| 86.2% 0.5%, | |
| 86.8% 0.6%, | |
| 87.3% 0.6%, | |
| 87.8% 0.7%, | |
| 88.2% 0.8%, | |
| 88.7% 0.9%, | |
| 89.1% 0.9%, | |
| 89.5% 1%, | |
| 89.9% 1.1%, | |
| 90.3% 1.2%, | |
| 90.7% 1.3%, | |
| 91% 1.4%, | |
| 91.4% 1.5%, | |
| 91.7% 1.6%, | |
| 92% 1.8%, | |
| 92.4% 1.9%, | |
| 92.7% 2%, | |
| 93% 2.2%, | |
| 93.2% 2.3%, | |
| 93.5% 2.4%, | |
| 93.8% 2.6%, | |
| 94% 2.7%, | |
| 94.3% 2.9%, | |
| 94.5% 3.1%, | |
| 94.8% 3.2%, | |
| 95% 3.4%, | |
| 95.2% 3.6%, | |
| 95.4% 3.8%, | |
| 95.6% 4%, | |
| 95.9% 4.1%, | |
| 96% 4.4%, | |
| 96.2% 4.6%, | |
| 96.4% 4.8%, | |
| 96.6% 5%, | |
| 96.8% 5.2%, | |
| 96.9% 5.5%, | |
| 97.1% 5.7%, | |
| 97.3% 6%, | |
| 97.4% 6.2%, | |
| 97.6% 6.5%, | |
| 97.7% 6.8%, | |
| 97.8% 7%, | |
| 98% 7.3%, | |
| 98.1% 7.6%, | |
| 98.2% 8%, | |
| 98.4% 8.3%, | |
| 98.5% 8.6%, | |
| 98.6% 9%, | |
| 98.7% 9.3%, | |
| 98.8% 9.7%, | |
| 98.9% 10.1%, | |
| 99% 10.5%, | |
| 99.1% 10.9%, | |
| 99.1% 11.3%, | |
| 99.2% 11.8%, | |
| 99.3% 12.2%, | |
| 99.4% 12.7%, | |
| 99.4% 13.2%, | |
| 99.5% 13.8%, | |
| 99.6% 14.3%, | |
| 99.6% 14.9%, | |
| 99.7% 15.6%, | |
| 99.7% 16.2%, | |
| 99.8% 17%, | |
| 99.8% 17.7%, | |
| 99.8% 18.6%, | |
| 99.9% 19.5%, | |
| 99.9% 20.5%, | |
| 99.9% 21.6%, | |
| 100% 22.8%, | |
| 100% 24.3%, | |
| 100% 26.1%, | |
| 100% 28.4%, | |
| 100% 31.8%, | |
| 100% 0 | |
| ); | |
| --border-squircle-inner: polygon( | |
| 100% 50%, | |
| 100% 72.3%, | |
| 100% 75.6%, | |
| 100% 77.7%, | |
| 100% 79.4%, | |
| 100% 80.7%, | |
| 99.9% 81.8%, | |
| 99.9% 82.8%, | |
| 99.9% 83.7%, | |
| 99.9% 84.5%, | |
| 99.8% 85.2%, | |
| 99.8% 85.9%, | |
| 99.8% 86.5%, | |
| 99.7% 87.1%, | |
| 99.7% 87.6%, | |
| 99.7% 88.2%, | |
| 99.6% 88.6%, | |
| 99.6% 89.1%, | |
| 99.5% 89.5%, | |
| 99.4% 89.9%, | |
| 99.4% 90.3%, | |
| 99.3% 90.7%, | |
| 99.2% 91.1%, | |
| 99.2% 91.4%, | |
| 99.1% 91.8%, | |
| 99% 92.1%, | |
| 98.9% 92.4%, | |
| 98.9% 92.7%, | |
| 98.8% 93%, | |
| 98.7% 93.3%, | |
| 98.6% 93.5%, | |
| 98.5% 93.8%, | |
| 98.4% 94%, | |
| 98.3% 94.3%, | |
| 98.2% 94.5%, | |
| 98% 94.7%, | |
| 97.9% 95%, | |
| 97.8% 95.2%, | |
| 97.7% 95.4%, | |
| 97.5% 95.6%, | |
| 97.4% 95.8%, | |
| 97.3% 96%, | |
| 97.1% 96.1%, | |
| 97% 96.3%, | |
| 96.8% 96.5%, | |
| 96.7% 96.7%, | |
| 96.5% 96.8%, | |
| 96.3% 97%, | |
| 96.1% 97.1%, | |
| 96% 97.3%, | |
| 95.8% 97.4%, | |
| 95.6% 97.5%, | |
| 95.4% 97.7%, | |
| 95.2% 97.8%, | |
| 95% 97.9%, | |
| 94.7% 98%, | |
| 94.5% 98.2%, | |
| 94.3% 98.3%, | |
| 94% 98.4%, | |
| 93.8% 98.5%, | |
| 93.5% 98.6%, | |
| 93.3% 98.7%, | |
| 93% 98.8%, | |
| 92.7% 98.9%, | |
| 92.4% 98.9%, | |
| 92.1% 99%, | |
| 91.8% 99.1%, | |
| 91.4% 99.2%, | |
| 91.1% 99.2%, | |
| 90.7% 99.3%, | |
| 90.3% 99.4%, | |
| 89.9% 99.4%, | |
| 89.5% 99.5%, | |
| 89.1% 99.6%, | |
| 88.6% 99.6%, | |
| 88.2% 99.7%, | |
| 87.6% 99.7%, | |
| 87.1% 99.7%, | |
| 86.5% 99.8%, | |
| 85.9% 99.8%, | |
| 85.2% 99.8%, | |
| 84.5% 99.9%, | |
| 83.7% 99.9%, | |
| 82.8% 99.9%, | |
| 81.8% 99.9%, | |
| 80.7% 100%, | |
| 79.4% 100%, | |
| 77.7% 100%, | |
| 75.6% 100%, | |
| 72.3% 100%, | |
| 50% 100%, | |
| 27.7% 100%, | |
| 24.4% 100%, | |
| 22.3% 100%, | |
| 20.6% 100%, | |
| 19.3% 100%, | |
| 18.2% 99.9%, | |
| 17.2% 99.9%, | |
| 16.3% 99.9%, | |
| 15.5% 99.9%, | |
| 14.8% 99.8%, | |
| 14.1% 99.8%, | |
| 13.5% 99.8%, | |
| 12.9% 99.7%, | |
| 12.4% 99.7%, | |
| 11.8% 99.7%, | |
| 11.4% 99.6%, | |
| 10.9% 99.6%, | |
| 10.5% 99.5%, | |
| 10.1% 99.4%, | |
| 9.7% 99.4%, | |
| 9.3% 99.3%, | |
| 8.9% 99.2%, | |
| 8.6% 99.2%, | |
| 8.2% 99.1%, | |
| 7.9% 99%, | |
| 7.6% 98.9%, | |
| 7.3% 98.9%, | |
| 7% 98.8%, | |
| 6.7% 98.7%, | |
| 6.5% 98.6%, | |
| 6.2% 98.5%, | |
| 6% 98.4%, | |
| 5.7% 98.3%, | |
| 5.5% 98.2%, | |
| 5.3% 98%, | |
| 5% 97.9%, | |
| 4.8% 97.8%, | |
| 4.6% 97.7%, | |
| 4.4% 97.5%, | |
| 4.2% 97.4%, | |
| 4% 97.3%, | |
| 3.9% 97.1%, | |
| 3.7% 97%, | |
| 3.5% 96.8%, | |
| 3.3% 96.7%, | |
| 3.2% 96.5%, | |
| 3% 96.3%, | |
| 2.9% 96.1%, | |
| 2.7% 96%, | |
| 2.6% 95.8%, | |
| 2.5% 95.6%, | |
| 2.3% 95.4%, | |
| 2.2% 95.2%, | |
| 2.1% 95%, | |
| 2% 94.7%, | |
| 1.8% 94.5%, | |
| 1.7% 94.3%, | |
| 1.6% 94%, | |
| 1.5% 93.8%, | |
| 1.4% 93.5%, | |
| 1.3% 93.3%, | |
| 1.2% 93%, | |
| 1.1% 92.7%, | |
| 1.1% 92.4%, | |
| 1% 92.1%, | |
| 0.9% 91.8%, | |
| 0.8% 91.4%, | |
| 0.8% 91.1%, | |
| 0.7% 90.7%, | |
| 0.6% 90.3%, | |
| 0.6% 89.9%, | |
| 0.5% 89.5%, | |
| 0.4% 89.1%, | |
| 0.4% 88.6%, | |
| 0.3% 88.2%, | |
| 0.3% 87.6%, | |
| 0.3% 87.1%, | |
| 0.2% 86.5%, | |
| 0.2% 85.9%, | |
| 0.2% 85.2%, | |
| 0.1% 84.5%, | |
| 0.1% 83.7%, | |
| 0.1% 82.8%, | |
| 0.1% 81.8%, | |
| 0% 80.7%, | |
| 0% 79.4%, | |
| 0% 77.7%, | |
| 0% 75.6%, | |
| 0% 72.3%, | |
| 0% 50%, | |
| 0% 27.7%, | |
| 0% 24.4%, | |
| 0% 22.3%, | |
| 0% 20.6%, | |
| 0% 19.3%, | |
| 0.1% 18.2%, | |
| 0.1% 17.2%, | |
| 0.1% 16.3%, | |
| 0.1% 15.5%, | |
| 0.2% 14.8%, | |
| 0.2% 14.1%, | |
| 0.2% 13.5%, | |
| 0.3% 12.9%, | |
| 0.3% 12.4%, | |
| 0.3% 11.8%, | |
| 0.4% 11.4%, | |
| 0.4% 10.9%, | |
| 0.5% 10.5%, | |
| 0.6% 10.1%, | |
| 0.6% 9.7%, | |
| 0.7% 9.3%, | |
| 0.8% 8.9%, | |
| 0.8% 8.6%, | |
| 0.9% 8.2%, | |
| 1% 7.9%, | |
| 1.1% 7.6%, | |
| 1.1% 7.3%, | |
| 1.2% 7%, | |
| 1.3% 6.7%, | |
| 1.4% 6.5%, | |
| 1.5% 6.2%, | |
| 1.6% 6%, | |
| 1.7% 5.7%, | |
| 1.8% 5.5%, | |
| 2% 5.3%, | |
| 2.1% 5%, | |
| 2.2% 4.8%, | |
| 2.3% 4.6%, | |
| 2.5% 4.4%, | |
| 2.6% 4.2%, | |
| 2.7% 4%, | |
| 2.9% 3.9%, | |
| 3% 3.7%, | |
| 3.2% 3.5%, | |
| 3.3% 3.3%, | |
| 3.5% 3.2%, | |
| 3.7% 3%, | |
| 3.9% 2.9%, | |
| 4% 2.7%, | |
| 4.2% 2.6%, | |
| 4.4% 2.5%, | |
| 4.6% 2.3%, | |
| 4.8% 2.2%, | |
| 5% 2.1%, | |
| 5.3% 2%, | |
| 5.5% 1.8%, | |
| 5.7% 1.7%, | |
| 6% 1.6%, | |
| 6.2% 1.5%, | |
| 6.5% 1.4%, | |
| 6.7% 1.3%, | |
| 7% 1.2%, | |
| 7.3% 1.1%, | |
| 7.6% 1.1%, | |
| 7.9% 1%, | |
| 8.2% 0.9%, | |
| 8.6% 0.8%, | |
| 8.9% 0.8%, | |
| 9.3% 0.7%, | |
| 9.7% 0.6%, | |
| 10.1% 0.6%, | |
| 10.5% 0.5%, | |
| 10.9% 0.4%, | |
| 11.4% 0.4%, | |
| 11.8% 0.3%, | |
| 12.4% 0.3%, | |
| 12.9% 0.3%, | |
| 13.5% 0.2%, | |
| 14.1% 0.2%, | |
| 14.8% 0.2%, | |
| 15.5% 0.1%, | |
| 16.3% 0.1%, | |
| 17.2% 0.1%, | |
| 18.2% 0.1%, | |
| 19.3% 0%, | |
| 20.6% 0%, | |
| 22.3% 0%, | |
| 24.4% 0%, | |
| 27.7% 0%, | |
| 50% 0%, | |
| 72.3% 0%, | |
| 75.6% 0%, | |
| 77.7% 0%, | |
| 79.4% 0%, | |
| 80.7% 0%, | |
| 81.8% 0.1%, | |
| 82.8% 0.1%, | |
| 83.7% 0.1%, | |
| 84.5% 0.1%, | |
| 85.2% 0.2%, | |
| 85.9% 0.2%, | |
| 86.5% 0.2%, | |
| 87.1% 0.3%, | |
| 87.6% 0.3%, | |
| 88.2% 0.3%, | |
| 88.6% 0.4%, | |
| 89.1% 0.4%, | |
| 89.5% 0.5%, | |
| 89.9% 0.6%, | |
| 90.3% 0.6%, | |
| 90.7% 0.7%, | |
| 91.1% 0.8%, | |
| 91.4% 0.8%, | |
| 91.8% 0.9%, | |
| 92.1% 1%, | |
| 92.4% 1.1%, | |
| 92.7% 1.1%, | |
| 93% 1.2%, | |
| 93.3% 1.3%, | |
| 93.5% 1.4%, | |
| 93.8% 1.5%, | |
| 94% 1.6%, | |
| 94.3% 1.7%, | |
| 94.5% 1.8%, | |
| 94.7% 2%, | |
| 95% 2.1%, | |
| 95.2% 2.2%, | |
| 95.4% 2.3%, | |
| 95.6% 2.5%, | |
| 95.8% 2.6%, | |
| 96% 2.7%, | |
| 96.1% 2.9%, | |
| 96.3% 3%, | |
| 96.5% 3.2%, | |
| 96.7% 3.3%, | |
| 96.8% 3.5%, | |
| 97% 3.7%, | |
| 97.1% 3.9%, | |
| 97.3% 4%, | |
| 97.4% 4.2%, | |
| 97.5% 4.4%, | |
| 97.7% 4.6%, | |
| 97.8% 4.8%, | |
| 97.9% 5%, | |
| 98% 5.3%, | |
| 98.2% 5.5%, | |
| 98.3% 5.7%, | |
| 98.4% 6%, | |
| 98.5% 6.2%, | |
| 98.6% 6.5%, | |
| 98.7% 6.7%, | |
| 98.8% 7%, | |
| 98.9% 7.3%, | |
| 98.9% 7.6%, | |
| 99% 7.9%, | |
| 99.1% 8.2%, | |
| 99.2% 8.6%, | |
| 99.2% 8.9%, | |
| 99.3% 9.3%, | |
| 99.4% 9.7%, | |
| 99.4% 10.1%, | |
| 99.5% 10.5%, | |
| 99.6% 10.9%, | |
| 99.6% 11.4%, | |
| 99.7% 11.8%, | |
| 99.7% 12.4%, | |
| 99.7% 12.9%, | |
| 99.8% 13.5%, | |
| 99.8% 14.1%, | |
| 99.8% 14.8%, | |
| 99.9% 15.5%, | |
| 99.9% 16.3%, | |
| 99.9% 17.2%, | |
| 99.9% 18.2%, | |
| 100% 19.3%, | |
| 100% 20.6%, | |
| 100% 22.3%, | |
| 100% 24.4%, | |
| 100% 27.7%, | |
| 100% 0 | |
| ); | |
| } | |
| .theme-mono { | |
| --border-color: white; | |
| --body-color: #17191e; | |
| } | |
| hey-houston::before, | |
| .glow::after { | |
| content: ""; | |
| position: absolute; | |
| inset: 0; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| aspect-ratio: 128 / 96; | |
| width: var(--size); | |
| background: var(--border-color); | |
| clip-path: var(--border-squircle); | |
| animation: floating 6s 0.3s ease-in-out infinite; | |
| } | |
| .glow::after { | |
| filter: blur(12px); | |
| border-radius: calc(var(--border-width) * 3); | |
| clip-path: initial; | |
| z-index: -1; | |
| opacity: 0.8; | |
| } | |
| .container { | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| aspect-ratio: 128 / 96; | |
| width: var(--size); | |
| background: var(--border-color); | |
| clip-path: var(--border-squircle); | |
| animation: floating 6s cubic-bezier(0.76, 0, 0.24, 1) infinite; | |
| } | |
| @keyframes floating { | |
| from, | |
| to { | |
| transform: translateY(0); | |
| } | |
| 50% { | |
| transform: translateY(calc(var(--border-width) * -1.5)); | |
| } | |
| } | |
| @keyframes fade { | |
| from, | |
| to { | |
| opacity: 1; | |
| } | |
| 50% { | |
| opacity: 0.4; | |
| } | |
| } | |
| hey-houston * { | |
| box-sizing: border-box; | |
| } | |
| hey-houston[theme="simple"] { | |
| background: black; | |
| } | |
| hey-houston[theme="simple"] .body { | |
| background: none; | |
| } | |
| .body { | |
| display: flex; | |
| aspect-ratio: 132 / 96; | |
| width: calc(100% - calc(var(--border-width) * 2)); | |
| background: var(--body-color); | |
| clip-path: var(--border-squircle-inner); | |
| } | |
| .face { | |
| display: grid; | |
| grid-template-columns: repeat(3, 1fr); | |
| align-items: center; | |
| aspect-ratio: 102 / 34; | |
| height: 40%; | |
| margin: auto auto 12.5%; | |
| transform: translate(0, 0); | |
| transition: transform 500ms cubic-bezier(0.23, 1, 0.32, 1); | |
| } | |
| [pose="cry"] .eye { | |
| z-index: 1; | |
| border: 0; | |
| background: linear-gradient(to bottom, #3245ff, #4af2c8); | |
| } | |
| [pose="cry"] .eye::before { | |
| content: ""; | |
| display: block; | |
| position: relative; | |
| width: calc(100% - var(--border-width)); | |
| height: calc(var(--border-width) * 8); | |
| margin: 0 auto; | |
| } | |
| [pose="cry"] .eye::after { | |
| content: ""; | |
| display: block; | |
| position: absolute; | |
| top: 0; | |
| width: calc(100% - calc(var(--border-width) * 2)); | |
| height: var(--border-width); | |
| margin: 0 auto; | |
| border: var(--border-width) solid currentColor; | |
| border-top-left-radius: 999px; | |
| border-top-right-radius: 999px; | |
| border-bottom: 0; | |
| } | |
| [pose="cry"] .mouth { | |
| align-self: flex-start; | |
| } | |
| hey-houston:hover .face { | |
| transform: translate(calc(var(--x) * 5%), calc(var(--y) * 25%)); | |
| } | |
| hey-houston.active { | |
| margin: -1rem 0 -1rem 0; | |
| transform: scale(0.5); | |
| } | |
| .loading .face { | |
| --delay: 175ms; | |
| transform: translate(0, -25%); | |
| } | |
| .loading :is(.eye, .mouth) { | |
| all: initial; | |
| aspect-ratio: 1; | |
| background: white; | |
| margin: 17.5% auto; | |
| width: calc(var(--border-width) * 2); | |
| border-radius: calc(var(--border-width) / 4); | |
| animation: floating 1s cubic-bezier(0.76, 0, 0.24, 1) infinite, | |
| fade 1s ease-in-out infinite; | |
| } | |
| .loading :is(.eye:first-child) { | |
| animation-delay: 0; | |
| } | |
| .loading :is(.mouth) { | |
| animation-delay: calc(var(--delay) * 1); | |
| } | |
| .loading :is(.eye:last-child) { | |
| animation-delay: calc(var(--delay) * 2); | |
| } | |
| .eye, | |
| .mouth { | |
| position: relative; | |
| aspect-ratio: 1; | |
| background: currentColor; | |
| margin: 17.5%; | |
| } | |
| [data-shape^="circle"] { | |
| border-radius: 50%; | |
| } | |
| [data-shape="heart"] { | |
| background: none; | |
| background-image: url("data:image/svg+xml,%3Csvg width='27' height='24' viewBox='0 0 27 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M26.3955 7.60322C26.3955 3.7173 23.246 0.568848 19.3611 0.568848C17.0029 0.568848 14.9219 1.73245 13.6455 3.51147C12.3692 1.73245 10.2871 0.568848 7.92988 0.568848C4.045 0.568848 0.895508 3.7173 0.895508 7.60322C0.895508 8.15244 0.964807 8.68822 1.08479 9.20124C2.06221 15.2696 8.80905 21.674 13.6455 23.4313C18.4809 21.674 25.2298 15.2696 26.2042 9.20331C26.3252 8.68822 26.3955 8.15244 26.3955 7.60322Z' fill='white'/%3E%3C/svg%3E%0A"); | |
| background-size: 100% 100%; | |
| transform: scale(1.25); | |
| } | |
| [data-shape^="circle-stroke"] { | |
| background: none; | |
| border: calc(var(--border-width) * 0.67) solid currentColor; | |
| } | |
| [data-shape^="bar"] { | |
| aspect-ratio: 80 / 24; | |
| border-radius: calc(var(--border-width) / 2); | |
| } | |
| [data-shape^="square"] { | |
| border-radius: calc(var(--border-width) / 2); | |
| transform: scale(0.9); | |
| } | |
| [data-shape$="small"] { | |
| transform: scale(0.55); | |
| } | |
| [data-shape^="half"] { | |
| aspect-ratio: 2 / 1; | |
| background: none; | |
| border: calc(var(--border-width) * 0.67) solid currentColor; | |
| } | |
| [data-shape^="half-up"] { | |
| border-bottom-left-radius: 999px; | |
| border-bottom-right-radius: 999px; | |
| border-top: 0; | |
| align-self: flex-end; | |
| } | |
| [data-shape^="half-down"] { | |
| border-top-left-radius: 999px; | |
| border-top-right-radius: 999px; | |
| border-bottom: 0; | |
| align-self: flex-start; | |
| } | |
| [data-shape$="top"] { | |
| align-self: flex-start; | |
| } | |
| [data-shape$="bottom"] { | |
| align-self: flex-end; | |
| } | |
| </style> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment