UNPKG

@zentered/solid-image-crop

Version:

Solid.js simple image crop tool using Cropper.js

77 lines (74 loc) 2.55 kB
import { Dialog, DialogPanel, DialogTitle, Transition, TransitionChild, DialogOverlay } from 'terracotta' import ImageDrop from './ImageDrop.jsx' import { createSignal } from 'solid-js' export default function ImageUploadDialog(props) { const [width, setWidth] = createSignal(16) const [height, setHeight] = createSignal(9) return ( <Transition appear show={props.isOpen()}> <Dialog isOpen class="fixed inset-0 z-10 overflow-y-auto" onClose={props.closeModal} > <div class="min-h-screen px-4 flex items-center justify-center"> <TransitionChild enter="ease-out duration-300" enterFrom="opacity-0" enterTo="opacity-100" leave="ease-in duration-200" leaveFrom="opacity-100" leaveTo="opacity-0" > <DialogOverlay class="fixed inset-0 bg-gray-900 bg-opacity-50" /> </TransitionChild> {/* This element is to trick the browser into centering the modal contents. */} <span class="inline-block h-screen align-middle" aria-hidden="true"> &#8203; </span> <TransitionChild enter="ease-out duration-300" enterFrom="opacity-0 scale-95" enterTo="opacity-100 scale-100" leave="ease-in duration-200" leaveFrom="opacity-100 scale-100" leaveTo="opacity-0 scale-95" > <DialogPanel class="inline-block w-full max-w-md p-6 my-8 overflow-hidden text-left align-middle transition-all transform bg-white shadow-xl rounded-2xl"> <DialogTitle as="h3" class="text-lg font-medium leading-6 text-gray-900" > {props.title} </DialogTitle> <ImageDrop saveImage={props.saveImage} aspectRatioWidth={width()} aspectRatioHeight={height()} /> <select class="mt-4" onChange={(e) => { const [w, h] = e.currentTarget.value.split(':') setWidth(parseInt(w)) setHeight(parseInt(h)) }} > <option value="16:9">16:9</option> <option value="4:3">4:3</option> <option value="1:1">1:1</option> </select> </DialogPanel> </TransitionChild> </div> </Dialog> </Transition> ) }