Files
kidsbox/www/styles.css
T
Claude bf9852c345 Implement full NFC-URL streaming architecture
- rc522: add NDEF URL reading via WUPA+cascade anticoll+SELECT+TLV parse
- AudioPlayer: route http:// URIs to esp_player_http_music_play()
- CacheManager: download URLs async to /sdcard/cache/{hash}.{ext}
- TagPlayerControl: NDEF URL → cache-or-stream; fallback to UID local mapping
- RFIDInterface: wire ndef_callback, expose combined uid+url callback
- WebInterface: add /api/info, /api/storage, /api/playback, /api/bluetooth
- BluetoothInterface: stub for A2DP speaker mode
- Networking: WiFi connect with 30s timeout instead of blocking forever
- main.cpp: re-enable WiFi + web server, fix init order, add CacheManager
- www/: full SPA — playback controls, device info, storage, BT pairing
- .gitmodules: switch rc522 submodule URL to HTTPS

https://claude.ai/code/session_01MhAnh68DPNnTjcKqjNYDmk
2026-06-12 19:44:54 +00:00

126 lines
2.7 KiB
CSS

*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
background: #f0f4f8;
color: #1a202c;
min-height: 100vh;
}
header {
background: #2d3748;
color: #fff;
padding: 1rem 1.5rem;
}
header h1 {
font-size: 1.5rem;
font-weight: 700;
}
main {
max-width: 700px;
margin: 1.5rem auto;
padding: 0 1rem;
display: flex;
flex-direction: column;
gap: 1.25rem;
}
.card {
background: #fff;
border-radius: 10px;
box-shadow: 0 2px 8px rgba(0,0,0,.08);
padding: 1.25rem 1.5rem;
}
.card h2 {
font-size: 1rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: .05em;
color: #718096;
margin-bottom: 1rem;
}
/* Playback */
.track-uri {
font-size: .9rem;
color: #4a5568;
word-break: break-all;
min-height: 1.2em;
margin-bottom: .75rem;
}
.playback-controls {
display: flex;
gap: .5rem;
margin-bottom: 1rem;
}
.volume-row {
display: flex;
align-items: center;
gap: .75rem;
}
.volume-row label { font-size: .875rem; color: #718096; white-space: nowrap; }
.volume-row input { flex: 1; }
#volume-label { font-size: .875rem; width: 2rem; text-align: right; }
/* Buttons */
.btn {
padding: .45rem .9rem;
border: none;
border-radius: 6px;
font-size: .875rem;
font-weight: 600;
cursor: pointer;
transition: opacity .15s;
}
.btn:disabled { opacity: .45; cursor: not-allowed; }
.btn:not(:disabled):hover { opacity: .85; }
.btn-primary { background: #4299e1; color: #fff; }
.btn-secondary { background: #e2e8f0; color: #2d3748; }
.btn-danger { background: #fc8181; color: #fff; }
/* Device info */
.info-table { width: 100%; border-collapse: collapse; margin-bottom: .75rem; }
.info-table th, .info-table td { padding: .35rem .5rem; text-align: left; font-size: .875rem; }
.info-table th { color: #718096; width: 40%; }
.info-table tr:not(:last-child) th,
.info-table tr:not(:last-child) td { border-bottom: 1px solid #edf2f7; }
/* Storage */
.storage-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: .75rem;
font-size: .875rem;
color: #4a5568;
}
.cache-list { list-style: none; }
.cache-list li {
display: flex;
align-items: center;
justify-content: space-between;
padding: .4rem 0;
border-bottom: 1px solid #edf2f7;
font-size: .875rem;
}
.cache-list li:last-child { border-bottom: none; }
.cache-list .cache-key { font-family: monospace; color: #4a5568; }
.cache-list .cache-size { color: #a0aec0; }
/* Bluetooth */
.bt-status { font-weight: 600; margin-bottom: .5rem; }
#btn-bt-toggle { margin-bottom: .5rem; }
.note { font-size: .8rem; color: #a0aec0; }