Files
drawing/pages/index.vue
2023-02-07 00:43:16 +08:00

289 lines
18 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template lang="pug">
div(class="mt-[60px] grid grid-cols-1 lg:grid-cols-4 xl:grid-cols-5 text-white bg-[#05020E] h-[calc(100vh-62px)] border-t border-white/10 2xl:border-t-0 mx-auto 2xl:border-x")
// 左侧信息
aside(class="flex flex-col divide-y divide-white/10 pt-6 space-y-6 lg:overflow-y-auto scrollbar-hide")
div
p.font-bold 迅速に開発できる
p.text-gray-400 あなたのアイデアを素早く実現するためのフレームワークです
textarea.mt-4.rounded-lg.h-32.w-full.px-4.py-2.bg-gray-500.bg-opacity-5.border.border-gray-500.border-opacity-20.text-gray-500(value="Search" type="text" class="focus:outline-none")
div
div.flex.items-center.justify-between
span.font-bold 从图像中删除特征
label.switch
input(type="checkbox" checked)
div.slider.round
p.text-gray-400 描述您不希望出现在图像中的细节, 例如颜色, 物体或是风景
div
p.font-bold 筛选
p.text-gray-400 尝试可以应用于您的图像的不同风格样式
input.mt-4.rounded-lg.h-9.w-full.px-4.py-2.bg-gray-500.bg-opacity-5.border.border-gray-500.border-opacity-20.text-gray-500(value="Search" type="text" class="focus:outline-none")
div(class="absolute w-screen lg:w-[400px] bottom-2 flex flex-col" style="max-height: 80vh; left: 418.797px; top: min(747px - min(1326.22px, 80vh), 582.656px);")
div(class="overflow-auto scrollbar-hide transition-[transform,opacity] duration-[50ms] z-50 pai-border rounded-lg bg-gray-900 shadow-2xl opacity-100")
div(class="space-y-2 items-center absolute overflow-hidden w-[calc(100%-2px)] px-4 pb-2 pt-4 lg:pt-2 z-50 bg-inherit rounded-t-lg border-b border-low border-white border-opacity-10")
div(class="flex justify-between")
h3(class="text-white font-bold") Filter
button(class="text-gray-600 pb-1 lg:hidden")
<svg viewBox="0 0 24 24" focusable="false" class="chakra-icon css-onkibi"><path fill="currentColor" d="M.439,21.44a1.5,1.5,0,0,0,2.122,2.121L11.823,14.3a.25.25,0,0,1,.354,0l9.262,9.263a1.5,1.5,0,1,0,2.122-2.121L14.3,12.177a.25.25,0,0,1,0-.354l9.263-9.262A1.5,1.5,0,0,0,21.439.44L12.177,9.7a.25.25,0,0,1-.354,0L2.561.44A1.5,1.5,0,0,0,.439,2.561L9.7,11.823a.25.25,0,0,1,0,.354Z"></path></svg>
div(class="relative")
input(type="text" placeholder="Search" class="input pai-border bg-gray-900 rounded-md mb-2 outline-none w-full p-2 pl-8" value="")
span(class="absolute left-2 top-2.5 text-gray-500")
<svg fill="none" height="20" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="20"><path d="M11 17.25a6.25 6.25 0 110-12.5 6.25 6.25 0 010 12.5z"></path><path d="M16 16l4.5 4.5"></path></svg>
div(class="h-32 lg:h-28")
div(class="grid grid-cols-3 sm:grid-cols-4 lg:grid-cols-3 gap-2 p-2 pt-0")
template(v-for="item in 18" :key="item")
button.h-24(class="transition-[transform,opacity] origin-center filter-button relative aspect-[6/5] duration-200 border-2 rounded-lg overflow-hidden active:border-blue-300/50 border-transparent hover:border-high" aria-label="Select filter style: Colorpop" style="transition-delay: 10ms;")
span( style="box-sizing: border-box; display: block; overflow: hidden; width: initial; height: initial; background: none; opacity: 1; border: 0px; margin: 0px; padding: 0px; position: absolute; inset: 0px;")
img( alt="Colorpop" src="https://storage.googleapis.com/pai-marketing/filters/elizaport_style.png" decoding="async" data-nimg="fill" style="position: absolute; inset: 0px; box-sizing: border-box; padding: 0px; border: none; margin: auto; display: block; width: 0px; height: 0px; min-width: 100%; max-width: 100%; min-height: 100%; max-height: 100%; object-fit: cover;" sizes="100vw" srcset="https://storage.googleapis.com/pai-marketing/filters/elizaport_style.png 640w, https://storage.googleapis.com/pai-marketing/filters/elizaport_style.png 750w, https://storage.googleapis.com/pai-marketing/filters/elizaport_style.png 828w, https://storage.googleapis.com/pai-marketing/filters/elizaport_style.png 1080w, https://storage.googleapis.com/pai-marketing/filters/elizaport_style.png 1200w, https://storage.googleapis.com/pai-marketing/filters/elizaport_style.png 1920w, https://storage.googleapis.com/pai-marketing/filters/elizaport_style.png 2048w, https://storage.googleapis.com/pai-marketing/filters/elizaport_style.png 3840w")
div( class="absolute inset-0 bg-gradient-to-t from-black/90 via-black/40 flex flex-col justify-end text-gray-100 text-left text-sm p-1") Colorpop
div
p.font-bold 通过图像生成图像
p.text-gray-400 上传或绘制图像以用作灵感
input.mt-4.rounded-lg.h-9.w-full.px-4.py-2.bg-gray-500.bg-opacity-5.border.border-gray-500.border-opacity-20.text-gray-500(value="Search" type="text" class="focus:outline-none")
div.overflow-hidden.flex.gap-2.items-center
img.relative.right-6.w-4(:src="IconEdit" style="filter: drop-shadow(#ffffff 24px 0);")
span 画点什么
div
button.mt-4.rounded-lg.h-9.w-full.px-4.py-2.bg-gray-500.bg-opacity-5.border.border-gray-500.border-opacity-20.text-gray-500(value="Search" type="text" class="focus:outline-none") 开始绘制
// 中间输出
main(class="xl:col-span-3 lg:col-span-2 lg:overflow-y-auto lg:overflow-x-hidden border-x border-white/10 relative scrollbar-hide")
div.flex.gap-2.pb-8
button.rounded-full.w-14.h-14.flex.justify-center.items-center(
:class="{ 'bg-gray-800': views.cardMode }"
@click="views.cardMode = !views.cardMode"
)
img(:src="IconGrid")
button.rounded-full.w-14.h-14.flex.justify-center.items-center(
:class="{ 'bg-gray-800': !views.cardMode }"
@click="views.cardMode = !views.cardMode"
)
img(:src="IconStack")
div.flex(:class="{'justify-center': !views.cardMode, 'flex-col':views.cardMode }")
div.bg-red-500.relative(style="max-width: min(512px, 100%);")
img(:src="ImageDemo" class="rounded-md object-contain")
div.rounded-md.absolute.inset-0.flex.flex-col.items-center.justify-center.transition-opacity.bg-gradient-to-t.to-transparent.opacity-0(
class="hover:cursor-pointer hover:opacity-100 from-black/90"
)
// 右侧参数
aside(class="lg:overflow-y-auto relative z-20 transition-all scrollbar-hide")
div(class="px-6 divide-y divide-white/10")
<fieldset class="create-fieldset py-8">
<label for="model-type">Model</label>
<p>Different AI models can produce different or better results so feel free to experiment.</p>
<div class="select">
<select name="model-type" id="model-type">
<option value="stable-diffusion" data-version="1.5" selected="">Stable Diffusion 1.5</option>
<option value="stable-diffusion-2" data-version="2.0">Stable Diffusion 2.1</option>
<option value="dalle-2" data-version="2.0">DALL·E 2</option>
</select>
<svg data-testid="geist-icon" fill="none" height="16" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24"><path d="M6 9l6 6 6-6"></path></svg>
</div>
</fieldset>
div(class="flex flex-col gap-y-8 py-8")
fieldset(class="create-fieldset")
label 图像尺寸
p 完成图像的宽度×高度.
div(class="flex flex-row flex-wrap gap-x-2 gap-y-2")
div(class="flex flex-row flex-wrap")
input.hidden(type="radio" class="radio-input" id="image-dim-1" checked="")
label.border.border-2.border-gray-500.rounded-md.px-4.py-1(for="image-dim-1" class="!text-[11px]" style="width:98px") 512 × 512
div(class="flex flex-row flex-wrap")
input.hidden(type="radio" class="radio-input" id="image-dim-2")
label.border.border-2.border-gray-500.rounded-md.px-4.py-1(for="image-dim-2" class="!text-[11px]" style="width:98px") 1024 × 1024
div(class="flex flex-row flex-wrap")
input.hidden(type="radio" class="radio-input" id="image-dim-3")
label.border.border-2.border-gray-500.rounded-md.px-4.py-1(for="image-dim-3" class="!text-[11px]" style="width:98px") 640 × 384
div(class="flex flex-row flex-wrap")
input.hidden(type="radio" class="radio-input" id="image-dim-4")
label.border.border-2.border-gray-500.rounded-md.px-4.py-1(for="image-dim-4" class="!text-[11px]" style="width:98px") 384 × 640
div(class="flex flex-row flex-wrap")
input.hidden(type="radio" class="radio-input" id="image-dim-5")
label.border.border-2.border-gray-500.rounded-md.px-4.py-1(for="image-dim-5" class="!text-[11px]" style="width:98px") 768 × 512
div(class="flex flex-row flex-wrap")
input.hidden(type="radio" class="radio-input" id="image-dim-6")
label.border.border-2.border-gray-500.rounded-md.px-4.py-1(for="image-dim-6" class="!text-[11px]" style="width:98px") 512 × 768
div(class="text-sm grey-100 mt-1")
p Buy a <a target="_blank" style="color:rgb(118 173 255)" href="/pricing">paid plan</a> for any width or height up to 1536px
fieldset(class="create-fieldset")
label Prompt Guidance
p Higher guidance will make your image closer to your prompt.
SliderUndefined
//div(id="slider-undefined" class="flex items-center gap-x-4 slider-container")
// div(tabindex="-1" style="position: relative; touch-action: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); user-select: none; outline: 0px; padding-top: 8px; padding-bottom: 8px;" class="chakra-slider css-1t1xvy7")
// div(id="slider-track-:R5mnqmqulm:" style="position:absolute;top:50%;transform:translateY(-50%);width:100%" class="chakra-slider__track css-8v2r68")
// div(class="css-11z5obk")
// div(aria-valuenow="6" class="chakra-slider__filled-track css-19vmo6h" style="position: absolute; top: 50%; transform: translateY(-50%); width: 20%; left: 0%;")
// div(role="slider" tabindex="0" id="slider-thumb-:R5mnqmqulm:" aria-valuemin="0" aria-valuemax="30" aria-valuenow="6" aria-orientation="horizontal" style="position: absolute; user-select: none; touch-action: none; left: calc(20% - 8px);" class="chakra-slider__thumb css-12qisgv")
// input(type="hidden" value="6")
// input(type="text" class="w-12 rounded-full bg-gray-900 text-xs text-center py-1 text-gray-200" value="6")
fieldset(class="create-fieldset")
label Quality &amp; Details
p More steps will result in a high quality image but will take longer.
div(id="slider-undefined" class="flex items-center gap-x-4 slider-container")
div(tabindex="-1" style="position: relative; touch-action: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); user-select: none; outline: 0px; padding-top: 8px; padding-bottom: 8px;" class="chakra-slider css-1t1xvy7")
div(id="slider-track-:R9onqmqulm:" style="position:absolute;top:50%;transform:translateY(-50%);width:100%" class="chakra-slider__track css-8v2r68")
div(class="css-11z5obk")
div(aria-valuenow="50" class="chakra-slider__filled-track css-19vmo6h" style="position: absolute; top: 50%; transform: translateY(-50%); width: 28.5714%; left: 0%;")
div(role="slider" tabindex="0" id="slider-thumb-:R9onqmqulm:" aria-valuemin="10" aria-valuemax="150" aria-valuenow="25" aria-orientation="horizontal" style="position: absolute; user-select: none; touch-action: none; left: calc(28.5714% - 8px);" class="chakra-slider__thumb css-12qisgv")
input(type="hidden" value="50")
input(type="text" class="w-12 rounded-full bg-gray-900 text-xs text-center py-1 text-gray-200" value="50")
div(class="flex flex-col gap-y-4 py-8")
<fieldset class="create-fieldset">
<label for="seed-input">Seed</label>
<p>Different numbers result in new variations of your image.</p>
<input id="seed-input" class="text-input" type="number" value="" disabled="">
<div class="flex items-center gap-x-2">
<label class="chakra-checkbox css-192puf7" data-checked="">
<input class="chakra-checkbox__input" type="checkbox" id="randomize-seed" style="border:0px;clip:rect(0px, 0px, 0px, 0px);height:1px;width:1px;margin:-1px;padding:0px;overflow:hidden;white-space:nowrap;position:absolute" checked="" value="">
<span class="chakra-checkbox__control css-19ag05x" aria-hidden="true" data-checked="">
<div style="display: flex; align-items: center; justify-content: center; height: 100%; transform: none;">
<svg viewBox="0 0 12 10" class="css-1x1o9fj" opacity="1" stroke-dashoffset="0" style="fill: none; stroke-width: 2; stroke: currentcolor; stroke-dasharray: 16;"><polyline points="1.5 6 4.5 9 10.5 1"></polyline></svg>
</div>
</span>
</label>
<label for="randomize-seed" class="text-sm text-gray-300 mt-1">Randomize each number to get new variations</label>
</div>
</fieldset>
<div class="flex flex-col gap-y-4" style="border-color:transparent">
<fieldset class="create-fieldset">
<button aria-label="Toggle advanced options" id="advanced-options-toggle"><div class="flex flex-row justify-center"><p class="advanced-options-toggle">Hide <!-- -->Advanced Options</p></div></button>
<div class="advanced-options-container transition-all overflow-hidden opacity-100 max-h-[99rem] pb-8">
<label>Sampler</label>
<p>The diffusion sampling method.</p>
<div class="select">
<select name="advanced-options" id="advanced-options">
<option value="1" selected="">pndm (plms)</option>
<option value="0">ddim</option>
<option value="2">k_euler</option>
<option value="3">k_euler_ancestral</option>
<option value="4">k_heun</option>
<option value="5">k_dpm_2</option>
<option value="6">k_dpm_2_ancestral</option>
<option value="7">k_lms</option>
</select>
<svg data-testid="geist-icon" fill="none" height="16" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" viewBox="0 0 24 24" width="24"><path d="M6 9l6 6 6-6"></path></svg>
</div>
</div>
</fieldset>
</div>
<fieldset class="create-fieldset py-8">
<label>Number of Images</label>
<p>Select the number of images you would like to generate.</p>
<div class="flex gap-x-2">
<input type="radio" class="radio-input" id="num-images-1" checked="">
<label for="num-images-1">1</label><input type="radio" class="radio-input" id="num-images-2">
<label for="num-images-2">2</label><input type="radio" class="radio-input" id="num-images-3">
<label for="num-images-3">3</label><input type="radio" class="radio-input" id="num-images-4">
<label for="num-images-4">4</label>
</div>
</fieldset>
div(class="flex flex-col gap-y-4 py-8")
fieldset(class="create-fieldset")
<label>Private Session</label>
<p>Images will only be visible to you until you're ready to share them. <span> Buy a <a target="_blank" href="/pricing" style="color: rgb(118, 173, 255);">paid plan</a> to persist this setting across sessions.</span></p>
<div class="flex gap-x-3 w-44 items-center">
<label class="chakra-switch [&amp;>span]:bg-[#39324E] [&amp;>span[data-checked]]:bg-[#76ADFF] [&amp;>span]:p-1 css-ghot30" data-checked="">
<input class="chakra-switch__input" type="checkbox" value="" style="border: 0px; clip: rect(0px, 0px, 0px, 0px); height: 1px; width: 1px; margin: -1px; padding: 0px; overflow: hidden; white-space: nowrap; position: absolute;">
<span aria-hidden="true" class="chakra-switch__track css-j1l0qk" data-checked="">
<span class="chakra-switch__thumb css-7roig" data-checked=""></span>
</span>
</label>
</div>
</template>
<script setup>
import IconEdit from 'assets/icon/edit-2.svg'
import IconGrid from 'assets/icon/grid.svg'
import IconStack from 'assets/icon/stack.svg'
import ImageDemo from 'assets/image/demo.png'
const views = ref({
cardMode: true,
active: true,
})
const imageCreate = ref({
// 输入:
// 输入关键词
// 排除关键词
// 预训练风格
// 图片生成图片
// 图像强度
// 输出:
// model
// 图片尺寸
// 图像指导
// 质量与细节
// 随机数种子
// 采样器
// 图片数量
// 私有会话
})
</script>
<style>
.pai-border {
border-width: 1px;
border-style: solid;
border-color: rgba(255, 255, 255, 0.08);
border-image: initial;
}
.switch {
position: relative;
display: inline-block;
width: 38px;
height: 24px;
}
.switch input {display:none;}
.slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #ccc;
-webkit-transition: .4s;
transition: .4s;
}
.slider:before {
position: absolute;
content: "";
height: 16px;
width: 16px;
left: 4px;
bottom: 4px;
background-color: white;
-webkit-transition: .4s;
transition: .4s;
}
input:checked + .slider {
background-color: #2196F3;
}
input:focus + .slider {
box-shadow: 0 0 1px #2196F3;
}
input:checked + .slider:before {
-webkit-transform: translateX(14px);
-ms-transform: translateX(14px);
transform: translateX(14px);
}
/* Rounded sliders */
.slider.round {
border-radius: 17px;
}
.slider.round:before {
border-radius: 50%;
}
</style>