Compare commits
21 Commits
Author | SHA1 | Date |
---|---|---|
Ashelyn Dawn | e6b414a4ee | 3 weeks ago |
Ashelyn Dawn | 0b7151e9a4 | 1 month ago |
Ashelyn Dawn | cc2e2fdc00 | 3 months ago |
Ashelyn Dawn | ff1cba1bab | 4 months ago |
Ashelyn Dawn | 85efcc0b69 | 4 months ago |
Ashelyn Dawn | f846668c8a | 5 months ago |
Ashelyn Dawn | 6afe0d00ac | 5 months ago |
Ashelyn Dawn | 14bfd8bc27 | 5 months ago |
Ashelyn Dawn | 5289646abb | 5 months ago |
Ashelyn Dawn | c74fad1793 | 5 months ago |
Ashelyn Dawn | 11aed6e30f | 5 months ago |
Ashelyn Dawn | 6f7f70a555 | 6 months ago |
Ashelyn Dawn | f9a75bf672 | 6 months ago |
Ashelyn Dawn | 7804d2cd10 | 9 months ago |
Ashelyn Dawn | 64ada98e82 | 10 months ago |
Ashelyn Dawn | 8730783c1c | 10 months ago |
Ashelyn Dawn | 53e7daffac | 11 months ago |
Ashelyn Dawn | ad08de6e94 | 11 months ago |
Ashelyn Dawn | 859fa4546f | 11 months ago |
Ashelyn Rose | 6697a293ae | 12 months ago |
Ashelyn Dawn | ab3c61f5cc | 1 year ago |
@ -1,2 +0,0 @@
|
||||
node_modules/
|
||||
.next/
|
@ -1,8 +0,0 @@
|
||||
pipeline:
|
||||
neocities:
|
||||
image: ruby:latest
|
||||
when:
|
||||
branch: main
|
||||
commands:
|
||||
- gem install neocities
|
||||
- neocities push .
|
@ -1,12 +0,0 @@
|
||||
from node:18
|
||||
|
||||
workdir /app
|
||||
copy package.json .
|
||||
copy package-lock.json .
|
||||
run npm ci
|
||||
copy . .
|
||||
|
||||
run npx next build
|
||||
|
||||
expose 3000
|
||||
entrypoint npx next start
|
@ -1,47 +1,83 @@
|
||||
import Image from 'next/image'
|
||||
import Link from 'next/link'
|
||||
import Image from 'components/Image'
|
||||
|
||||
import system from '~/config/system.json'
|
||||
import styles from '~/styles/about.module.css'
|
||||
import profilePics from '~/utils/profiles'
|
||||
|
||||
export interface Member {
|
||||
name: string,
|
||||
featured: boolean,
|
||||
mainPronouns: string,
|
||||
color: string,
|
||||
bioShort: string,
|
||||
readMore: string,
|
||||
profileImg: string,
|
||||
}
|
||||
|
||||
export default function About() {
|
||||
const members = system.members as Member[]
|
||||
const featuredMembers : Member[] = members.filter(({featured}) => featured)
|
||||
const nonfeaturedMembers : Member[] = members.filter(({featured}) => !featured)
|
||||
|
||||
return (
|
||||
<>
|
||||
<h1 className="pageTitle">
|
||||
About Us
|
||||
</h1>
|
||||
<main className={styles.container}>
|
||||
{system.members.map((member: Member) => {
|
||||
{featuredMembers.map((member: Member) => {
|
||||
const style = { "--member-color": member.color } as React.CSSProperties
|
||||
return (
|
||||
<section className={styles.member} style={style}>
|
||||
<Image alt="" width={150} height={150} src={profilePics[member.name.toLowerCase()]} />
|
||||
<Image
|
||||
alt=""
|
||||
width={150}
|
||||
height={150}
|
||||
src={member.profileImg}
|
||||
/>
|
||||
<h2>{member.name}</h2>
|
||||
<p className={styles.pronouns}>{member.mainPronouns}</p>
|
||||
<p className={styles.bio}>
|
||||
{member.bioShort}
|
||||
</p>
|
||||
<p><a href={`/about/${member.name.toLowerCase()}`}>{member.readMore}</a></p>
|
||||
<p>
|
||||
<Link href={`/about/${member.name.toLowerCase()}`}>{member.readMore}</Link>
|
||||
</p>
|
||||
</section>
|
||||
)
|
||||
})}
|
||||
</main >
|
||||
</main>
|
||||
<div className={styles.summary}>
|
||||
<p>
|
||||
Our system is composed of the above three members. Generally you
|
||||
don't have to care who is most present at any given time, as we share
|
||||
memory and flow in and out of front pretty often, but we do appreciate
|
||||
when people notice us individually
|
||||
Generally the above four members are who interact with others
|
||||
throughout our day to day. They handle our work, our social relationships,
|
||||
and our broader plans for life. In addition, our system has another
|
||||
internally-focused member who you will likely not meet unless you seek it out:
|
||||
</p>
|
||||
{nonfeaturedMembers.map((member: Member) => {
|
||||
const style = { "--member-color": member.color } as React.CSSProperties
|
||||
return (
|
||||
<section className={`${styles.member} ${styles.lower}`} style={style}>
|
||||
<Image
|
||||
alt=""
|
||||
width={80}
|
||||
height={80}
|
||||
src={member.profileImg}
|
||||
/>
|
||||
<h2>{member.name}</h2>
|
||||
<p className={styles.pronouns}>{member.mainPronouns}</p>
|
||||
<p className={styles.bio}>
|
||||
{member.bioShort}
|
||||
</p>
|
||||
<p>
|
||||
<Link href={`/about/${member.name.toLowerCase()}`}>{member.readMore}</Link>
|
||||
</p>
|
||||
</section>
|
||||
)
|
||||
})}
|
||||
<p>For avatar sources, see <a href="https://static.tempest.dev/credit.txt">here</a></p>
|
||||
</div>
|
||||
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
@ -0,0 +1,69 @@
|
||||
'use client'
|
||||
|
||||
import styles from '~/styles/form.module.css'
|
||||
|
||||
const submitUrl = 'https://contact.tempest.dev/api/contact/me'
|
||||
import { useState, useRef, FormEvent } from 'react'
|
||||
|
||||
export default function ContactForm() {
|
||||
const [submitting, setSubmitting] = useState(false)
|
||||
const [status, setStatus] = useState('')
|
||||
|
||||
const nameRef = useRef<HTMLInputElement>()
|
||||
const emailRef = useRef<HTMLInputElement>()
|
||||
const messageRef = useRef<HTMLTextAreaElement>()
|
||||
|
||||
const submit = async (ev: FormEvent<HTMLFormElement>) => {
|
||||
ev.preventDefault()
|
||||
|
||||
setStatus('')
|
||||
|
||||
const name = nameRef.current.value
|
||||
const email = emailRef.current.value
|
||||
const message = messageRef.current.value
|
||||
|
||||
if (!name) setStatus(s => s + ' Name required.')
|
||||
if (!email) setStatus(s => s + ' Email required.')
|
||||
if (!message) setStatus(s => s + ' Message required.')
|
||||
|
||||
if (!name || !email || !message)
|
||||
return
|
||||
|
||||
setSubmitting(true)
|
||||
|
||||
try {
|
||||
|
||||
await fetch(submitUrl, {
|
||||
method: 'post',
|
||||
headers: {
|
||||
'content-type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({
|
||||
name, email, message
|
||||
})
|
||||
})
|
||||
|
||||
setStatus('Message sent successfully')
|
||||
} catch {
|
||||
setStatus('Error submitting message, please try again')
|
||||
} finally {
|
||||
setSubmitting(false)
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<form className={styles.form} onSubmit={submit}>
|
||||
<label htmlFor="name">Name:</label>
|
||||
<input disabled={submitting} name="name" ref={nameRef} />
|
||||
|
||||
<label htmlFor="email">Email:</label>
|
||||
<input disabled={submitting} name="email" ref={emailRef} />
|
||||
|
||||
<label htmlFor="message">Message:</label>
|
||||
<textarea disabled={submitting} name="message" ref={messageRef} />
|
||||
|
||||
<button disabled={submitting} type="submit">Submit</button>
|
||||
{status && <span className={styles.status}>{status}</span>}
|
||||
</form>
|
||||
)
|
||||
}
|
@ -0,0 +1,121 @@
|
||||
import { promises as fs } from 'fs'
|
||||
import { createHash } from 'node:crypto'
|
||||
import path from 'path'
|
||||
import { ImgHTMLAttributes } from 'react'
|
||||
import sharp from 'sharp'
|
||||
|
||||
const outputDir = path.join(process.cwd(), '.next/static/images')
|
||||
const serverPath = '/_next/static/images/'
|
||||
|
||||
interface ReqProps {
|
||||
src: string,
|
||||
alt: string,
|
||||
}
|
||||
|
||||
type FixedSingleDimension = {width: number} | {height: number}
|
||||
type FixedBothDimension = {width: number, height: number}
|
||||
type MultiSize = {width: number[]} | {height: number[]}
|
||||
type SizeProps = FixedSingleDimension | FixedBothDimension | MultiSize
|
||||
type ImageAttrs = Omit<ImgHTMLAttributes<HTMLImageElement>, "width" | "height" | "src">
|
||||
|
||||
type ImageProps = ImageAttrs
|
||||
& SizeProps
|
||||
& ReqProps
|
||||
|
||||
interface ProcessedImage {
|
||||
hostPath: string,
|
||||
randPrefix: string,
|
||||
origSrc: string,
|
||||
aspectRatio: number,
|
||||
}
|
||||
|
||||
|
||||
async function ImageServer({src,...imgAttrs}: ImageProps) {
|
||||
const width = 'width' in imgAttrs ? imgAttrs.width : null
|
||||
const height = 'height' in imgAttrs ? imgAttrs.height : null
|
||||
|
||||
// Handle where we have an array of widths
|
||||
if (Array.isArray(width)) {
|
||||
let _src : string = src
|
||||
const srcSet = (await Promise.all(width.map(async width => {
|
||||
const {outputPath, origSrc} = await processImage(src, {width})
|
||||
_src = origSrc
|
||||
return `${outputPath} ${width}w`
|
||||
}))).join(',')
|
||||
|
||||
return (
|
||||
<img
|
||||
src={_src}
|
||||
srcSet={srcSet}
|
||||
{...imgAttrs}
|
||||
width={undefined}
|
||||
height={undefined}
|
||||
/>
|
||||
)
|
||||
}else if (Array.isArray(height)) {
|
||||
let _src : string = src
|
||||
const srcSet = (await Promise.all(height.map(async height => {
|
||||
const {outputPath, origSrc} = await processImage(src, {height})
|
||||
_src = origSrc
|
||||
return `${outputPath} ${width}w`
|
||||
}))).join(',')
|
||||
|
||||
return (
|
||||
<img
|
||||
src={_src}
|
||||
srcSet={srcSet}
|
||||
{...imgAttrs}
|
||||
width={undefined}
|
||||
height={undefined}
|
||||
/>
|
||||
)
|
||||
} else {
|
||||
const {outputPath, resolvedWidth} = await processImage(src, {width, height})
|
||||
return <img src={outputPath} {...imgAttrs} height={undefined} width={resolvedWidth} />
|
||||
}
|
||||
}
|
||||
|
||||
async function processImage(sourcePath: string, {width, height} : {width?: number, height?: number}) : Promise<{outputPath: string, resolvedWidth: number, origSrc: string}> {
|
||||
await fs.mkdir(outputDir, {recursive: true})
|
||||
|
||||
const hostPath = path.join(process.cwd(), sourcePath)
|
||||
const srcImg = sharp(hostPath)
|
||||
const metadata = await srcImg.metadata()
|
||||
const extension = path.extname(hostPath)
|
||||
const filename = path.basename(hostPath, extension)
|
||||
const hashPrefix = createHash('sha256').update(hostPath).digest('hex').substr(0, 7)
|
||||
const origSrc = `${hashPrefix}-${filename}${extension}`
|
||||
const aspectRatio = metadata.width / metadata.height
|
||||
const resolvedWidth = width ? width : aspectRatio * height
|
||||
const outputName = `${hashPrefix}-${filename}-${resolvedWidth}w${extension}`
|
||||
|
||||
const origCopyStat = await fs.stat(path.join(outputDir, origSrc)).catch(() => undefined)
|
||||
if (!origCopyStat?.isFile()) {
|
||||
console.log(`copying file ${hostPath}`)
|
||||
await fs.copyFile(hostPath, path.join(outputDir, origSrc))
|
||||
}
|
||||
|
||||
const outputStat = await fs.stat(path.join(outputDir, outputName)).catch(() => undefined)
|
||||
if (!outputStat?.isFile()) {
|
||||
console.log(`resizing file ${hostPath} for width ${resolvedWidth}`)
|
||||
|
||||
await srcImg
|
||||
.resize({width: resolvedWidth})
|
||||
.toFile(path.join(outputDir, outputName))
|
||||
}
|
||||
|
||||
return {
|
||||
outputPath: serverPath + outputName,
|
||||
resolvedWidth,
|
||||
origSrc,
|
||||
}
|
||||
}
|
||||
|
||||
export default function ImageServerWrap(props: ImageProps) {
|
||||
return (
|
||||
<>
|
||||
{/* @ts-expect-error Async Server Component */}
|
||||
<ImageServer {...props} />
|
||||
</>
|
||||
)
|
||||
}
|
@ -1,9 +1,15 @@
|
||||
import Link from 'next/link'
|
||||
|
||||
export default function Footer() {
|
||||
return (
|
||||
<footer>
|
||||
<span>Website by ashelyn rose</span>
|
||||
<a href="https://git.tempest.dev/ashe/tempest.dev">Site Source</a>
|
||||
<a href="/pay-transparency">Pay Transparency</a>
|
||||
<span>
|
||||
<a style={{ textDecoration: 'none' }} href="https://webring.umbreon.online/prev?from=https://tempest.dev"><</a>
|
||||
<a target="_blank" href="https://webring.umbreon.online/">webring</a>
|
||||
<a style={{ textDecoration: 'none' }} href="https://webring.umbreon.online/next?from=https://tempest.dev">></a>
|
||||
</span>
|
||||
<Link href="/pay-transparency">Pay Transparency</Link>
|
||||
</footer>
|
||||
)
|
||||
}
|
||||
|
@ -0,0 +1,77 @@
|
||||
{
|
||||
"nodes": {
|
||||
"nix-filter": {
|
||||
"locked": {
|
||||
"lastModified": 1681154353,
|
||||
"narHash": "sha256-MCJ5FHOlbfQRFwN0brqPbCunLEVw05D/3sRVoNVt2tI=",
|
||||
"owner": "numtide",
|
||||
"repo": "nix-filter",
|
||||
"rev": "f529f42792ade8e32c4be274af6b6d60857fbee7",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "nix-filter",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1685005470,
|
||||
"narHash": "sha256-Nw+4uivzCwyZcEB71YH58zYk4N5UgcNeqb+D52bjlhI=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "60a2bc32e7369caf2f009f701ca98a8622abfdb3",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "master",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"nix-filter": "nix-filter",
|
||||
"nixpkgs": "nixpkgs",
|
||||
"utils": "utils"
|
||||
}
|
||||
},
|
||||
"systems": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"utils": {
|
||||
"inputs": {
|
||||
"systems": "systems"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1681202837,
|
||||
"narHash": "sha256-H+Rh19JDwRtpVPAWp64F+rlEtxUWBAQW28eAi3SRSzg=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "cfacdce06f30d2b68473a46042957675eebb3401",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
@ -0,0 +1,134 @@
|
||||
{
|
||||
inputs = {
|
||||
utils.url = "github:numtide/flake-utils";
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/master";
|
||||
nix-filter.url = "github:numtide/nix-filter";
|
||||
};
|
||||
|
||||
outputs = {
|
||||
self,
|
||||
nixpkgs,
|
||||
utils,
|
||||
nix-filter,
|
||||
}:
|
||||
utils.lib.eachDefaultSystem
|
||||
(system: let
|
||||
pkgs = import nixpkgs {
|
||||
inherit system;
|
||||
};
|
||||
|
||||
filter = nix-filter.lib;
|
||||
|
||||
nodejs = pkgs.nodejs-18_x;
|
||||
|
||||
src = filter {
|
||||
root = ./.;
|
||||
include = [
|
||||
./package.json
|
||||
./package-lock.json
|
||||
];
|
||||
};
|
||||
|
||||
packageLock = builtins.fromJSON(builtins.readFile (src + "/package-lock.json"));
|
||||
|
||||
deps = builtins.attrValues (removeAttrs packageLock.packages [ "" ])
|
||||
++ builtins.attrValues (removeAttrs (packageLock.dependencies or {} ) [ "" ])
|
||||
;
|
||||
tarballs = map (p: pkgs.fetchurl { url = p.resolved; hash = p.integrity; }) deps;
|
||||
tarballsFile = pkgs.writeTextFile {
|
||||
name = "tarballs";
|
||||
text = builtins.concatStringsSep "\n" tarballs;
|
||||
};
|
||||
|
||||
tempestdev_modules = pkgs.stdenv.mkDerivation {
|
||||
inherit src;
|
||||
|
||||
name = "node_modules";
|
||||
|
||||
buildInputs = [ nodejs ];
|
||||
|
||||
buildPhase = ''
|
||||
export HOME=$PWD/.home
|
||||
export npm_config_cache=$PWD/.npm
|
||||
|
||||
while read package
|
||||
do
|
||||
echo "caching $(echo $package | sed 's/\/nix\/store\/[^-]*-//')"
|
||||
npm cache add "$package"
|
||||
done <${tarballsFile}
|
||||
|
||||
${nodejs}/bin/npm ci
|
||||
'';
|
||||
|
||||
installPhase = ''
|
||||
mkdir $out
|
||||
mv node_modules $out/node_modules
|
||||
'';
|
||||
};
|
||||
in {
|
||||
packages = {
|
||||
|
||||
default = pkgs.stdenv.mkDerivation {
|
||||
name = "tempest.dev";
|
||||
|
||||
src = filter {
|
||||
root = ./.;
|
||||
exclude = [
|
||||
./.next
|
||||
./node_modules
|
||||
];
|
||||
};
|
||||
|
||||
nativeBuildInputs = [ nodejs ];
|
||||
|
||||
configurePhase = ''
|
||||
ln -sf ${tempestdev_modules}/node_modules node_modules
|
||||
export HOME=$TMP
|
||||
'';
|
||||
|
||||
buildPhase = ''
|
||||
npm run build
|
||||
'';
|
||||
|
||||
installPhase = ''
|
||||
mv out $out
|
||||
'';
|
||||
};
|
||||
};
|
||||
}) // {
|
||||
nixosModule = {config, lib, pkgs, ...}:
|
||||
with lib;
|
||||
let cfg = config.ashe.services."tempest.dev";
|
||||
pkg = self.packages.${pkgs.system}.default;
|
||||
|
||||
|
||||
in {
|
||||
options.ashe.services."tempest.dev" = {
|
||||
enable = mkEnableOption "Enables the tempest.dev HTTP service";
|
||||
|
||||
domain = mkOption rec {
|
||||
type = types.str;
|
||||
default = "tempest.dev";
|
||||
example = default;
|
||||
description = "The domain name for tempest.dev";
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
services.nginx.virtualHosts.${cfg.domain} = {
|
||||
locations."/" = {
|
||||
root = "${pkg}";
|
||||
};
|
||||
locations."/.well-known/" = {
|
||||
extraConfig = ''
|
||||
alias ${pkg}/.well-known/;
|
||||
add_header Content-Type text/plain;
|
||||
'';
|
||||
};
|
||||
forceSSL = true;
|
||||
enableACME = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
Binary file not shown.
After Width: | Height: | Size: 216 KiB |
Binary file not shown.
Before Width: | Height: | Size: 585 KiB After Width: | Height: | Size: 874 KiB |
Binary file not shown.
After Width: | Height: | Size: 251 KiB |
@ -1,5 +1,4 @@
|
||||
/// <reference types="next" />
|
||||
/// <reference types="next/image-types/global" />
|
||||
|
||||
// NOTE: This file should not be edited
|
||||
// see https://nextjs.org/docs/basic-features/typescript for more information.
|
||||
|
@ -0,0 +1,7 @@
|
||||
module.exports = {
|
||||
output: 'export',
|
||||
trailingSlash: true,
|
||||
images: {
|
||||
disableStaticImages: true
|
||||
},
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
ashe: they/them (collectively)
|
||||
rose: they/them
|
||||
violet: they/it
|
||||
dawn: she/it
|
||||
corona: she/they
|
||||
echo: it/its
|
@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="538.976" height="auto" viewBox="0 0 142.604 83.456" fill="white"><path d="M54.604 1.176C43.158 20.393 24.232 53.76 12.243 69.112 5.036 78.339 5.123 77.945.6 80.81c-.752 1.16-1.058 2.192.661 2.646 16.11-11.59 36.723-19.474 53.9-30.104.12 6.764-.812 11.014-4.33 14.45.168.096 16.612-.37 20.272-3.929 10.575-10.284 18.11-28.074 20.414-33.529 3.998-9.462 5.664-14.712 6.106-16.833.422-2.021-.732-2.253-1.758-.155-2.96 6.05-5.538 12.318-8.063 18.616-4.019 10.258-8.67 19.065-11.657 29.15-.485 1.638 2.703 1.205 3.298.45 2.311-2.935 4.725-5.795 6.782-8.925 1.266-1.926 2.997-3.652 4.71-5.477 1.4-1.488 1.777-.189 1.607.756-.715 3.973-2.666 8.173-1.378 11.753.521 1.447 4.838 3.496 8.465.437.444-.374.915-.72 1.323-1.134 3.15-3.917 10.236-9.918 10.255-14.78-1.449-3.749-6.414.183-8.27 1.646-2.209 2.276-4.762 6.066-2.93 8.449 1.353 1.842 4.704 2.623 6.989 2.666 5.104.097 9.185-1.396 13.639-3.84 6.248-3.43 18.962-7.81 19.912-7.952 3.514-1.311 1.984-1.887-.569-1.497-4.72.883-9.098 3.074-13.607 4.725-4.691 1.717-8.827 4.17-13.618 5.587-1.759.52-3.93 1.146-5.753.933-1.764-.206-3.64-.872-4.953-2.067-1.687-1.536.467-4.005 1.834-5.398 2.07-2.108 7.14-4.306 5.387-.756-2.255 4.089-6.4 7.694-9.434 10.489-1.853 1.321-5.206 3.732-6.747.79-1.77-3.378 1.834-10.093 1.367-11.94-.667-2.64-1.857-2.678-3.613-1.04-1.05.98-3.56 3.43-5.593 6.461-1.43 2.133-3.326 4.374-4.708 6.02-1.878 2.515-2.848 2.988-1.91.713 3.266-7.926 7.452-18.333 7.492-18.366 0 0-3.006 3.502-6.12 8.802-2.705 4.836-5.216 9.996-9.377 13.014-5.03 3.648-8.907 3.07-15.124 3.672-3.476-.025-6.79.438-10.12-.45-1.285-.038-2.457.797.292 3.19 8.026 6.99 10.964-4.858 11.34-12.945l.283-3.402c-.03-1.44-.798-2.558-1.89-1.795-12.598 8.8-24.516 14.212-37.892 21.261l-6.993 3.685-1.04.473C28.293 49.87 37.65 30.92 50.494 9.845c.731-1.024.999-.837.945.19-7.554 20.092-14.22 40.717-22.962 60.098-.558 1.618.178 3.866 1.796 1.228 8.504-22.364 15.682-45.203 25.253-67.185 1.492-3.427.666-5.665-.921-3z"></path></svg>
|
Before Width: | Height: | Size: 2.0 KiB |
Binary file not shown.
@ -1,7 +0,0 @@
|
||||
import rose from '~/images/profile/rose.png'
|
||||
import dawn from '~/images/profile/dawn.png'
|
||||
import echo from '~/images/profile/echo.png'
|
||||
|
||||
export default {
|
||||
rose, dawn, echo
|
||||
}
|
Loading…
Reference in New Issue