Initial commit: Anvil Lounge chat application

- React frontend with Vite + TypeScript
- Cloudflare Worker backend with Durable Objects
- AI-powered chat moderation via OpenAI
- WebSocket-based real-time messaging
- XSS prevention, rate limiting, input validation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
kappa
2026-01-19 10:17:27 +09:00
commit 554c578345
38 changed files with 10608 additions and 0 deletions

View File

@@ -0,0 +1,79 @@
.message-input {
display: flex;
gap: 12px;
padding: 16px;
background: #16213e;
border-top: 1px solid #0f3460;
}
.message-input .input-wrapper {
flex: 1;
position: relative;
display: flex;
flex-direction: column;
}
.message-input .char-count {
position: absolute;
right: 12px;
bottom: -18px;
font-size: 11px;
color: #666;
transition: color 0.2s;
}
.message-input .char-count.warning {
color: #e94560;
font-weight: 600;
}
.message-input textarea {
flex: 1;
padding: 12px 16px;
border: 2px solid #0f3460;
border-radius: 24px;
background: #1a1a2e;
color: #eee;
font-size: 15px;
font-family: inherit;
resize: none;
min-height: 44px;
max-height: 120px;
transition: border-color 0.2s;
}
.message-input textarea:focus {
outline: none;
border-color: #e94560;
}
.message-input textarea::placeholder {
color: #555;
}
.message-input textarea:disabled {
opacity: 0.6;
cursor: not-allowed;
}
.message-input button {
padding: 12px 24px;
border: none;
border-radius: 24px;
background: #e94560;
color: white;
font-size: 15px;
font-weight: 600;
cursor: pointer;
transition: background 0.2s, opacity 0.2s;
white-space: nowrap;
}
.message-input button:hover:not(:disabled) {
background: #d63a52;
}
.message-input button:disabled {
opacity: 0.5;
cursor: not-allowed;
}