diff --git a/public/admin.html b/public/admin.html index 1aae1d5..da786ea 100644 --- a/public/admin.html +++ b/public/admin.html @@ -34,6 +34,7 @@ } button:disabled { opacity: .5; cursor: default; } button.danger { background: transparent; color: #d33; padding: 4px 8px; font-weight: 400; } + button.plain { background: transparent; color: #2b6cf5; padding: 4px 8px; font-weight: 400; } button.big { padding: 12px 28px; } table { width: 100%; border-collapse: collapse; font-size: 14px; } th { text-align: left; font-size: 12px; color: #6b7590; font-weight: 500; padding: 6px 8px; } @@ -50,6 +51,30 @@ #msg.err { color: #d33; } .muted { color: #6b7590; font-size: 13px; } progress { width: 240px; } + #cropModal { + position: fixed; inset: 0; z-index: 100; display: flex; + align-items: center; justify-content: center; padding: 20px; + background: rgba(0, 0, 0, .55); + } + #cropModal[hidden] { display: none; } + #cropPanel { + background: #fff; border-radius: 12px; padding: 20px; + max-width: 560px; max-height: 92vh; overflow: auto; + } + @media (prefers-color-scheme: dark) { #cropPanel { background: #1a1f2b; } } + #cropPanel h2 { font-size: 16px; margin: 0 0 8px; } + #cropStage { + position: relative; display: inline-block; margin-top: 10px; + touch-action: none; user-select: none; overflow: hidden; border-radius: 8px; + } + #cropImg { display: block; max-width: 100%; max-height: 58vh; } + #cropRect { + position: absolute; border: 2px solid #2b6cf5; pointer-events: none; + box-shadow: 0 0 0 9999px rgba(0, 0, 0, .5); + } + #cropMsg { min-height: 1.4em; margin-top: 8px; } + #cropMsg.err { color: #d33; } + .cropBtns { display: flex; gap: 10px; justify-content: flex-end; margin-top: 12px; } @@ -82,6 +107,24 @@ + +