From 03bf91ecfd3accd9852e9a0e62846777e2ec2682 Mon Sep 17 00:00:00 2001 From: pcarter Date: Sat, 11 Apr 2026 12:25:03 -0700 Subject: [PATCH] improvements --- app/globals.css | 107 ++++++++++++++++++++++++++---------- app/icon.svg | 6 ++ app/page.tsx | 118 ++++++++++++++++++++++------------------ app/share/[id]/page.tsx | 31 +++++++---- 4 files changed, 170 insertions(+), 92 deletions(-) create mode 100644 app/icon.svg diff --git a/app/globals.css b/app/globals.css index ca2d4ed..f5468aa 100644 --- a/app/globals.css +++ b/app/globals.css @@ -294,6 +294,48 @@ header select option { } .message { + display: flex; + align-items: stretch; +} + +.message-shell { + width: 100%; + border: 1px solid var(--border); + background: #0a0a0a; + padding: 10px 12px 12px; +} + +.message.user .message-shell { + border-left: 2px solid rgba(85, 153, 255, 0.6); + background: rgba(85, 153, 255, 0.03); +} + +.message.assistant .message-shell { + border-left: 2px solid rgba(51, 255, 51, 0.55); + background: rgba(51, 255, 51, 0.02); +} + +.message-head { + display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; + gap: 12px; + margin-bottom: 10px; + padding-bottom: 6px; + border-bottom: 1px solid rgba(255, 255, 255, 0.05); +} + +.message-label { + color: var(--dim); + font-size: 11px; + letter-spacing: 0.08em; +} + +.message.user .message-label { color: rgba(85, 153, 255, 0.85); } +.message.assistant .message-label { color: rgba(51, 255, 51, 0.85); } + +.message-body { display: flex; gap: 12px; align-items: flex-start; @@ -301,41 +343,35 @@ header select option { .msg-actions { display: flex; - gap: 4px; - margin-top: 6px; - opacity: 0; - transition: opacity 0.15s; + gap: 6px; + flex-wrap: wrap; } -.message:hover .msg-actions { opacity: 1; } - .msg-copy-btn { background: transparent; color: var(--dim); - border: 1px solid transparent; + border: 1px solid var(--border); font-family: inherit; font-size: 11px; - padding: 2px 6px; + padding: 2px 7px; cursor: pointer; white-space: nowrap; } -.message:hover .msg-copy-btn { } -.msg-copy-btn:hover { color: var(--green); border-color: var(--border); } +.msg-copy-btn:hover { color: var(--green); border-color: var(--green); } .msg-retry-btn { background: transparent; color: var(--dim); - border: 1px solid transparent; + border: 1px solid var(--border); font-family: inherit; font-size: 11px; - padding: 2px 6px; + padding: 2px 7px; cursor: pointer; white-space: nowrap; } -.message:hover .msg-retry-btn { } -.msg-retry-btn:hover { color: var(--fg); border-color: var(--border); } +.msg-retry-btn:hover { color: var(--fg); border-color: var(--fg); } .saved-flash { color: var(--green); @@ -346,16 +382,15 @@ header select option { .msg-edit-btn { background: transparent; color: var(--dim); - border: 1px solid transparent; + border: 1px solid var(--border); font-family: inherit; font-size: 11px; - padding: 2px 6px; + padding: 2px 7px; cursor: pointer; white-space: nowrap; } -.message:hover .msg-edit-btn { } -.msg-edit-btn:hover { color: var(--blue); border-color: var(--border); } +.msg-edit-btn:hover { color: var(--blue); border-color: var(--blue); } .edit-form { display: flex; @@ -449,11 +484,12 @@ header select option { .input-area { display: flex; flex-direction: column; - padding: 10px 16px; - border-top: 1px solid var(--border); - background: #080808; + padding: 12px 16px 14px; + border-top: 1px solid var(--green); + background: #060606; flex-shrink: 0; gap: 8px; + box-shadow: inset 0 1px 0 rgba(51, 255, 51, 0.08); } .pending-attachments { @@ -523,13 +559,22 @@ header select option { display: flex; align-items: flex-start; gap: 8px; + border: 1px solid var(--border); + background: #0a0a0a; + padding: 10px 12px; +} + +.input-row:focus-within { + border-color: var(--green); + box-shadow: inset 0 0 0 1px rgba(51, 255, 51, 0.1); } .input-prompt { color: var(--green); font-weight: bold; - padding-top: 4px; + padding-top: 5px; flex-shrink: 0; + text-shadow: 0 0 8px rgba(51, 255, 51, 0.18); } .input-row textarea { @@ -540,7 +585,7 @@ header select option { font-family: inherit; font-size: 16px; /* must be ≥16px to prevent iOS Safari auto-zoom on focus */ line-height: 1.6; - padding: 4px 0; + padding: 4px 2px; resize: none; min-height: 32px; max-height: 200px; @@ -548,16 +593,16 @@ header select option { } .input-row textarea:focus { outline: none; } -.input-row textarea::placeholder { color: var(--dim); } +.input-row textarea::placeholder { color: #4b4b4b; } .input-row textarea:disabled { opacity: 0.4; } .input-row button { - background: transparent; + background: #091109; color: var(--green); border: 1px solid var(--green); font-family: inherit; font-size: 13px; - padding: 4px 10px; + padding: 5px 12px; cursor: pointer; white-space: nowrap; flex-shrink: 0; @@ -578,15 +623,21 @@ header select option { color: var(--bg); } +.input-row > button:last-child:not(:disabled) { + box-shadow: 0 0 10px rgba(51, 255, 51, 0.18); +} + /* On desktop: tools flow inline with the rest of the input row */ .input-tools { - display: contents; + display: flex; + gap: 8px; + align-items: flex-start; } /* On mobile: textarea gets its own full-width row; tools + [SEND] share the row below */ @media (pointer: coarse) { .input-area { - padding: 8px 12px; + padding: 10px 12px 12px; } .input-row { flex-wrap: wrap; diff --git a/app/icon.svg b/app/icon.svg new file mode 100644 index 0000000..094f42a --- /dev/null +++ b/app/icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/app/page.tsx b/app/page.tsx index 95a08cd..d6816ca 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -832,67 +832,81 @@ export default function Home() { )} {messages.map((msg, i) => (
- {msg.role === 'user' ? '>' : '#'} -
- {msg.images && msg.images.length > 0 && ( -
- {msg.images.map((img, j) => ( - - ))} -
- )} - {editingIndex === i ? ( -
-