diff --git a/index.html b/index.html index ff8b05c..d0779cc 100644 --- a/index.html +++ b/index.html @@ -165,10 +165,112 @@ overflow: hidden; box-shadow: 0 32px 80px rgba(0,0,0,0.7), 0 0 0 1px rgba(255,255,255,0.06); background: #000; + position: relative; + } + + #canvas-outer { + position: relative; + width: 100%; } #preview-canvas { display: block; width: 100%; height: auto; } + #trash-zone { + display: none; + position: absolute; + bottom: -56px; + left: 50%; + transform: translateX(-50%); + width: 52px; + height: 52px; + border-radius: 50%; + background: rgba(220, 60, 60, 0.15); + border: 1.5px dashed rgba(220, 80, 80, 0.4); + align-items: center; + justify-content: center; + transition: background 0.15s, border-color 0.15s, transform 0.15s; + cursor: default; + z-index: 200; + } + + #trash-zone.active { + display: flex; + } + + #trash-zone.over { + background: rgba(220, 60, 60, 0.45); + border-color: rgba(220, 80, 80, 0.9); + transform: translateX(-50%) scale(1.15); + } + + #trash-zone svg { + opacity: 0.7; + } + + #trash-zone.over svg { + opacity: 1; + } + + .drag-item { + position: absolute; + cursor: grab; + user-select: none; + display: flex; + align-items: flex-start; + gap: 0; + padding: 6px 8px; + border-radius: 6px; + transition: background 0.1s; + } + + .drag-item:hover { + background: rgba(255,255,255,0.06); + } + + .drag-item.dragging { + cursor: grabbing; + background: rgba(200,169,110,0.12); + outline: 1px dashed rgba(200,169,110,0.4); + z-index: 100; + opacity: 0.85; + } + + .drag-item .snap-indicator { + display: none; + } + + .drag-grid-hint { + position: absolute; + inset: 0; + pointer-events: none; + opacity: 0; + transition: opacity 0.2s; + } + + #drag-layer.dragging-active .drag-grid-hint { + opacity: 1; + } + + .drag-handle-icon { + position: absolute; + top: 4px; + right: 4px; + opacity: 0; + font-size: 10px; + color: rgba(200,169,110,0.6); + pointer-events: none; + font-family: monospace; + } + + .drag-item:hover .drag-handle-icon { + opacity: 1; + } + + @media (hover: none) { + .drag-item { cursor: default; } + .drag-handle-icon { display: none; } + } + .actions { display: flex; gap: 12px; @@ -381,6 +483,67 @@ .btn-regenerate:hover { background: rgba(200,169,110,0.18); } + .toggle-row { + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; + margin-top: 18px; + gap: 12px; + } + + .toggle-item { + display: flex; + align-items: center; + gap: 10px; + flex: 1; + background: rgba(255,255,255,0.03); + border: 1px solid var(--border); + border-radius: 9px; + padding: 10px 14px; + cursor: pointer; + } + + .toggle-item input[type=checkbox] { display: none; } + + .toggle-switch { + width: 36px; + height: 20px; + background: rgba(255,255,255,0.1); + border-radius: 10px; + position: relative; + flex-shrink: 0; + transition: background 0.2s; + } + + .toggle-switch::after { + content: ''; + position: absolute; + width: 14px; + height: 14px; + background: #fff; + border-radius: 50%; + top: 3px; + left: 3px; + transition: transform 0.2s; + } + + .toggle-item input:checked + .toggle-switch { + background: var(--accent); + } + + .toggle-item input:checked + .toggle-switch::after { + transform: translateX(16px); + } + + .toggle-label { + font-size: 12px; + font-family: 'Space Mono', monospace; + letter-spacing: 0.1em; + text-transform: uppercase; + color: var(--muted); + } + .fits-notice { font-size: 12px; color: var(--muted); @@ -543,7 +706,7 @@
Camera Spec Card Generator
by Justin Oros

Turn any photo into
a camera spec card

-

Drop a photo (and/or Siril FIT file). We'll read its EXIF metadata and generate a shareable spec overlay — perfect for Instagram.

+

Drop a photo for your spec-card background. Optionally, drop a Siril FIT file. We'll read its EXIF metadata and generate a shareable spec overlay, perfect for Instagram.

@@ -571,8 +734,21 @@
Your spec card
-