452 lines
13 KiB
Plaintext
452 lines
13 KiB
Plaintext
<rml>
|
|
<head>
|
|
<link type="text/rcss" href="../../ui/html.rcss"/>
|
|
<link type="text/rcss" href="../../ui/theme.rcss"/>
|
|
<link type="text/rcss" href="../../ui/components.rcss"/>
|
|
<link type="text/rcss" href="../../ui/layout.rcss"/>
|
|
<script src="../../scripts/navigation.lua"></script>
|
|
<script src="../../scripts/layout.lua"></script>
|
|
<script src="music.lua"></script>
|
|
<title>Music</title>
|
|
<style>
|
|
.music-content {
|
|
flex: 1;
|
|
overflow: auto;
|
|
padding-bottom: 140px;
|
|
}
|
|
|
|
.mini-player {
|
|
position: absolute;
|
|
bottom: 56px;
|
|
left: 0;
|
|
right: 0;
|
|
display: flex;
|
|
align-items: center;
|
|
padding: 8px 16px;
|
|
background-color: #282828;
|
|
border-top: 1px solid #333333;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.mini-player:hover {
|
|
background-color: #333333;
|
|
}
|
|
|
|
.mini-player-art {
|
|
width: 48px;
|
|
height: 48px;
|
|
border-radius: 4px;
|
|
background-color: #667eea;
|
|
margin-right: 12px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-size: 20px;
|
|
color: #FFFFFF;
|
|
}
|
|
|
|
.mini-player-info {
|
|
flex: 1;
|
|
}
|
|
|
|
.mini-player-title {
|
|
font-size: 16px;
|
|
color: #FFFFFF;
|
|
font-weight: 500;
|
|
}
|
|
|
|
.mini-player-artist {
|
|
font-size: 14px;
|
|
color: #B3B3B3;
|
|
margin-top: 2px;
|
|
}
|
|
|
|
.mini-control-btn {
|
|
width: 48px;
|
|
height: 48px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
cursor: pointer;
|
|
border-radius: 24px;
|
|
}
|
|
|
|
.mini-control-btn:hover {
|
|
background-color: rgba(255, 255, 255, 0.1);
|
|
}
|
|
|
|
.mini-control-btn img {
|
|
width: 28px;
|
|
height: 28px;
|
|
pointer-events: none;
|
|
}
|
|
|
|
.section-header {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
padding: 20px 16px 12px 16px;
|
|
}
|
|
|
|
.section-title {
|
|
font-size: 20px;
|
|
font-weight: 700;
|
|
color: #FFFFFF;
|
|
}
|
|
|
|
.section-action {
|
|
font-size: 14px;
|
|
font-weight: 600;
|
|
color: #B3B3B3;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.section-action:hover {
|
|
color: #FFFFFF;
|
|
}
|
|
|
|
.recent-row {
|
|
display: flex;
|
|
overflow-x: auto;
|
|
padding: 0 16px;
|
|
gap: 16px;
|
|
}
|
|
|
|
.recent-item {
|
|
min-width: 120px;
|
|
cursor: pointer;
|
|
padding: 8px;
|
|
border-radius: 8px;
|
|
}
|
|
|
|
.recent-item:hover {
|
|
background-color: rgba(255, 255, 255, 0.05);
|
|
}
|
|
|
|
.recent-art {
|
|
width: 120px;
|
|
height: 120px;
|
|
border-radius: 8px;
|
|
margin-bottom: 12px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-size: 36px;
|
|
color: #FFFFFF;
|
|
}
|
|
|
|
.recent-title {
|
|
font-size: 16px;
|
|
color: #FFFFFF;
|
|
font-weight: 500;
|
|
margin-bottom: 4px;
|
|
}
|
|
|
|
.recent-subtitle {
|
|
font-size: 14px;
|
|
color: #B3B3B3;
|
|
}
|
|
|
|
.quick-access {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
gap: 8px;
|
|
padding: 0 16px;
|
|
}
|
|
|
|
.quick-card {
|
|
width: 48%;
|
|
display: flex;
|
|
align-items: center;
|
|
background-color: #282828;
|
|
border-radius: 4px;
|
|
padding: 0;
|
|
height: 56px;
|
|
overflow: hidden;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.quick-card:hover {
|
|
background-color: #333333;
|
|
}
|
|
|
|
.quick-card-art {
|
|
width: 56px;
|
|
height: 56px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-size: 18px;
|
|
color: #FFFFFF;
|
|
}
|
|
|
|
.quick-card-title {
|
|
font-size: 14px;
|
|
font-weight: 600;
|
|
color: #FFFFFF;
|
|
padding: 0 12px;
|
|
}
|
|
|
|
.playlist-item {
|
|
display: flex;
|
|
align-items: center;
|
|
padding: 12px 16px;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.playlist-item:hover {
|
|
background-color: #1E1E1E;
|
|
}
|
|
|
|
.playlist-art {
|
|
width: 56px;
|
|
height: 56px;
|
|
border-radius: 4px;
|
|
margin-right: 12px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-size: 20px;
|
|
color: #FFFFFF;
|
|
}
|
|
|
|
.playlist-info {
|
|
flex: 1;
|
|
}
|
|
|
|
.playlist-title {
|
|
font-size: 16px;
|
|
color: #FFFFFF;
|
|
font-weight: 500;
|
|
}
|
|
|
|
.playlist-meta {
|
|
font-size: 14px;
|
|
color: #B3B3B3;
|
|
margin-top: 4px;
|
|
}
|
|
|
|
.music-bottom-nav {
|
|
position: absolute;
|
|
bottom: 0;
|
|
left: 0;
|
|
right: 0;
|
|
display: flex;
|
|
height: 56px;
|
|
background-color: #1E1E1E;
|
|
border-top: 1px solid #282828;
|
|
}
|
|
|
|
.nav-item {
|
|
flex: 1;
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
justify-content: center;
|
|
cursor: pointer;
|
|
color: #B3B3B3;
|
|
}
|
|
|
|
.nav-item:hover {
|
|
background-color: rgba(255, 255, 255, 0.05);
|
|
}
|
|
|
|
.nav-item.active {
|
|
color: #FFFFFF;
|
|
}
|
|
|
|
.nav-item img {
|
|
width: 28px;
|
|
height: 28px;
|
|
margin-bottom: 4px;
|
|
pointer-events: none;
|
|
}
|
|
|
|
.nav-item span {
|
|
font-size: 14px;
|
|
}
|
|
|
|
/* Progress bar for mini player */
|
|
.progress-container {
|
|
position: absolute;
|
|
top: 0;
|
|
left: 0;
|
|
right: 0;
|
|
height: 2px;
|
|
background-color: #404040;
|
|
}
|
|
|
|
.progress-bar {
|
|
width: 0%;
|
|
height: 100%;
|
|
background-color: #1DB954;
|
|
}
|
|
|
|
.bg-gradient-1 { background-color: #667eea; }
|
|
.bg-gradient-2 { background-color: #f093fb; }
|
|
.bg-gradient-3 { background-color: #4facfe; }
|
|
.bg-gradient-4 { background-color: #43e97b; }
|
|
.bg-gradient-5 { background-color: #fa709a; }
|
|
.bg-solid-purple { background-color: #7c3aed; }
|
|
.bg-solid-red { background-color: #dc2626; }
|
|
.bg-solid-green { background-color: #16a34a; }
|
|
.bg-solid-blue { background-color: #2563eb; }
|
|
</style>
|
|
</head>
|
|
<body class="app-screen" onload="initLayout(document); initMusic(document)">
|
|
<!-- System Status Bar -->
|
|
<div class="system-status-bar">
|
|
<span id="status-time" class="system-status-time">12:30</span>
|
|
<div class="system-status-icons">
|
|
<img src="../../icons/wifi.tga"/>
|
|
<img src="../../icons/signal.tga"/>
|
|
<img src="../../icons/battery.tga"/>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- App Bar -->
|
|
<div class="app-bar">
|
|
<div class="app-bar-back" onclick="goBack()">
|
|
<img src="../../icons/back.tga"/>
|
|
</div>
|
|
<span class="app-bar-title">Music</span>
|
|
<div class="app-bar-actions">
|
|
<div class="app-bar-action" onclick="openSearch()">
|
|
<img src="../../icons/search.tga"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Content -->
|
|
<div class="music-content">
|
|
<!-- Good Afternoon Section -->
|
|
<div class="section-header">
|
|
<span class="section-title">Good afternoon</span>
|
|
</div>
|
|
|
|
<!-- Quick Access Grid -->
|
|
<div class="quick-access" id="quick-access">
|
|
<div class="quick-card" onclick="openPlaylist('liked')">
|
|
<div class="quick-card-art bg-solid-red">L</div>
|
|
<span class="quick-card-title">Liked Songs</span>
|
|
</div>
|
|
<div class="quick-card" onclick="openPlaylist('daily1')">
|
|
<div class="quick-card-art bg-gradient-1">D</div>
|
|
<span class="quick-card-title">Daily Mix 1</span>
|
|
</div>
|
|
<div class="quick-card" onclick="openPlaylist('release')">
|
|
<div class="quick-card-art bg-solid-green">R</div>
|
|
<span class="quick-card-title">Release Radar</span>
|
|
</div>
|
|
<div class="quick-card" onclick="openPlaylist('chill')">
|
|
<div class="quick-card-art bg-gradient-2">C</div>
|
|
<span class="quick-card-title">Chill Vibes</span>
|
|
</div>
|
|
<div class="quick-card" onclick="openPlaylist('workout')">
|
|
<div class="quick-card-art bg-solid-blue">W</div>
|
|
<span class="quick-card-title">Workout Mix</span>
|
|
</div>
|
|
<div class="quick-card" onclick="openPlaylist('focus')">
|
|
<div class="quick-card-art bg-gradient-3">F</div>
|
|
<span class="quick-card-title">Focus Flow</span>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Recently Played -->
|
|
<div class="section-header">
|
|
<span class="section-title">Recently Played</span>
|
|
<span class="section-action">SEE ALL</span>
|
|
</div>
|
|
|
|
<div class="recent-row" id="recent-row">
|
|
<div class="recent-item" onclick="openPlaylist('pop')">
|
|
<div class="recent-art bg-gradient-4">P</div>
|
|
<div class="recent-title">Pop Hits</div>
|
|
<div class="recent-subtitle">Playlist</div>
|
|
</div>
|
|
<div class="recent-item" onclick="openPlaylist('electronic')">
|
|
<div class="recent-art bg-gradient-5">E</div>
|
|
<div class="recent-title">Electronic</div>
|
|
<div class="recent-subtitle">Playlist</div>
|
|
</div>
|
|
<div class="recent-item" onclick="openPlaylist('jazz')">
|
|
<div class="recent-art bg-gradient-1">J</div>
|
|
<div class="recent-title">Jazz Classics</div>
|
|
<div class="recent-subtitle">Playlist</div>
|
|
</div>
|
|
<div class="recent-item" onclick="openPlaylist('rock')">
|
|
<div class="recent-art bg-gradient-2">R</div>
|
|
<div class="recent-title">Rock Legends</div>
|
|
<div class="recent-subtitle">Playlist</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Made For You -->
|
|
<div class="section-header">
|
|
<span class="section-title">Made For You</span>
|
|
<span class="section-action">SEE ALL</span>
|
|
</div>
|
|
|
|
<div class="playlist-item" onclick="openPlaylist('daily1')">
|
|
<div class="playlist-art bg-gradient-3">1</div>
|
|
<div class="playlist-info">
|
|
<div class="playlist-title">Daily Mix 1</div>
|
|
<div class="playlist-meta">Based on your listening</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="playlist-item" onclick="openPlaylist('daily2')">
|
|
<div class="playlist-art bg-gradient-4">2</div>
|
|
<div class="playlist-info">
|
|
<div class="playlist-title">Daily Mix 2</div>
|
|
<div class="playlist-meta">Electronic, Ambient, Chill</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="playlist-item" onclick="openPlaylist('discover')">
|
|
<div class="playlist-art bg-gradient-5">D</div>
|
|
<div class="playlist-info">
|
|
<div class="playlist-title">Discover Weekly</div>
|
|
<div class="playlist-meta">Your weekly mixtape</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Mini Player -->
|
|
<div class="mini-player" onclick="openNowPlaying()">
|
|
<div class="progress-container">
|
|
<div class="progress-bar" id="progress-bar"></div>
|
|
</div>
|
|
<div class="mini-player-art" id="mini-player-art">M</div>
|
|
<div class="mini-player-info">
|
|
<div class="mini-player-title" id="mini-player-title">Midnight City</div>
|
|
<div class="mini-player-artist" id="mini-player-artist">M83</div>
|
|
</div>
|
|
<div style="display: flex; gap: 4px;">
|
|
<div class="mini-control-btn" onclick="toggleLike(); event.stopPropagation();">
|
|
<img src="../../icons/heart.tga"/>
|
|
</div>
|
|
<div class="mini-control-btn" id="mini-play-btn" onclick="togglePlay(); event.stopPropagation();">
|
|
<img src="../../icons/play.tga"/>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Bottom Navigation -->
|
|
<div class="music-bottom-nav">
|
|
<div class="nav-item active">
|
|
<img src="../../icons/home.tga"/>
|
|
<span>Home</span>
|
|
</div>
|
|
<div class="nav-item" onclick="openSearch()">
|
|
<img src="../../icons/search.tga"/>
|
|
<span>Search</span>
|
|
</div>
|
|
<div class="nav-item" onclick="openLibrary()">
|
|
<img src="../../icons/library.tga"/>
|
|
<span>Library</span>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</rml>
|