1
0
mirror of https://gitlab.xiph.org/xiph/icecast-server.git synced 2025-02-02 15:07:36 -05:00

Preparations for new webinterface design

This commit is contained in:
Marvin Scholz 2014-12-29 16:32:52 +01:00
parent 490482deaf
commit 1d8e128320
31 changed files with 1597 additions and 494 deletions

View File

@ -2,6 +2,8 @@
AUTOMAKE_OPTIONS = foreign AUTOMAKE_OPTIONS = foreign
SUBDIRS = includes
admindir = $(pkgdatadir)/admin admindir = $(pkgdatadir)/admin
dist_admin_DATA = listclients.xsl listmounts.xsl moveclients.xsl response.xsl \ dist_admin_DATA = listclients.xsl listmounts.xsl moveclients.xsl response.xsl \
stats.xsl manageauth.xsl updatemetadata.xsl xspf.xsl vclt.xsl stats.xsl manageauth.xsl updatemetadata.xsl xspf.xsl vclt.xsl

View File

@ -0,0 +1,8 @@
## Process this file with automake to produce Makefile.in
AUTOMAKE_OPTIONS = foreign
otheradmindir = $(admindir)/includes
otheradmin_DATA = footer.xsl head.xsl header.xsl mountnav.xsl
EXTRA_DIST = $(otheradmin_DATA)

10
admin/includes/footer.xsl Normal file
View File

@ -0,0 +1,10 @@
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0">
<xsl:output method="html" doctype-system="about:legacy-compat" encoding="UTF-8" indent="yes" />
<xsl:template name="footer">
<div class="footer">
<p>Support Icecast development at <a href="http://icecast.org">icecast.org</a></p>
</div>
</xsl:template>
</xsl:stylesheet>

12
admin/includes/head.xsl Normal file
View File

@ -0,0 +1,12 @@
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0">
<xsl:output method="html" doctype-system="about:legacy-compat" encoding="UTF-8" indent="yes" />
<xsl:template name="head">
<xsl:param name="title"/>
<head>
<meta charset="utf-8" />
<title><xsl:if test="$title"><xsl:value-of select="$title"/></xsl:if>Icecast Admin</title>
<link rel="stylesheet" type="text/css" href="/assets/css/style.css" />
<meta name="description" content="Icecast Server status page" />
</head>
</xsl:template>
</xsl:stylesheet>

23
admin/includes/header.xsl Normal file
View File

@ -0,0 +1,23 @@
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0">
<xsl:output method="html" doctype-system="about:legacy-compat" encoding="UTF-8" indent="yes" />
<xsl:template name="header">
<div class="header">
<h1>
<a href="/" title="Home page">Icecast</a>
<xsl:text> </xsl:text>
<span>administration</span>
</h1>
<div class="nav">
<label for="toggle-nav" class="nobar" title="Toggle navigation"></label>
<input type="checkbox" id="toggle-nav" />
<ul>
<li class="on"><a href="/admin/stats.xsl">Administration</a></li>
<li><a href="/admin/listmounts.xsl">Mountpoint list</a></li>
<li><a href="/status.xsl">Public area</a></li>
</ul>
</div>
</div>
</xsl:template>
</xsl:stylesheet>

View File

@ -0,0 +1,14 @@
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0">
<xsl:output method="html" doctype-system="about:legacy-compat" encoding="UTF-8" indent="yes" />
<xsl:template name="mountnav">
<xsl:param name="mount" select="@mount"/>
<div class="nav">
<ul>
<li><a href="listclients.xsl?mount={$mount}">Clients</a></li>
<li><a href="moveclients.xsl?mount={$mount}">Move listeners</a></li>
<li><a href="updatemetadata.xsl?mount={$mount}">Metadata</a></li>
<li><a href="killsource.xsl?mount={$mount}">Kill source</a></li>
</ul>
</div>
</xsl:template>
</xsl:stylesheet>

View File

@ -1,69 +1,45 @@
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" > <xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0">
<xsl:output omit-xml-declaration="no" method="xml" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="yes" encoding="UTF-8" /> <xsl:output method="html" doctype-system="about:legacy-compat" encoding="UTF-8" indent="yes" />
<xsl:template match = "/icestats" > <!-- Import include files -->
<html xmlns="http://www.w3.org/1999/xhtml"> <xsl:include href="includes/head.xsl"/>
<head> <xsl:include href="includes/header.xsl"/>
<title>Icecast Streaming Media Server</title> <xsl:include href="includes/footer.xsl"/>
<link rel="stylesheet" type="text/css" href="/style.css" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" /> <xsl:include href="includes/mountnav.xsl"/>
</head>
<body> <xsl:template match="/icestats">
<h1>Icecast2 Admin</h1> <html>
<!--index header menu -->
<div id="menu"> <xsl:call-template name="head">
<ul> <xsl:with-param name="title">Stats</xsl:with-param>
<li><a href="stats.xsl">Admin Home</a></li> </xsl:call-template>
<li><a href="listmounts.xsl">Mountpoint List</a></li>
<li><a href="/status.xsl">Public Home</a></li> <body>
</ul> <!-- Header/Menu -->
</div> <xsl:call-template name="header" />
<!--end index header menu -->
<div class="section">
<h2>Listener Stats</h2> <h2>Listener Stats</h2>
<xsl:for-each select="source"> <xsl:for-each select="source">
<div class="roundbox"> <div class="article">
<div class="mounthead">
<h3>Mountpoint <xsl:value-of select="@mount" /></h3> <h3>Mountpoint <xsl:value-of select="@mount" /></h3>
<div class="right"> <!-- Mount nav -->
<xsl:choose> <xsl:call-template name="mountnav" />
<xsl:when test="authenticator">
<a class="auth" href="/auth.xsl">Login</a>
</xsl:when>
<xsl:otherwise>
<ul class="mountlist">
<li><a class="play" href="{@mount}.m3u">M3U</a></li>
<li><a class="play" href="{@mount}.xspf">XSPF</a></li>
<li><a class="play" href="{@mount}.vclt">VCLT</a></li>
</ul>
</xsl:otherwise>
</xsl:choose>
</div>
</div>
<div class="mountcont">
<ul class="nav">
<li class="active"><a href="listclients.xsl?mount={@mount}">List Clients</a></li>
<li><a href="moveclients.xsl?mount={@mount}">Move Listeners</a></li>
<li><a href="updatemetadata.xsl?mount={@mount}">Update Metadata</a></li>
<xsl:if test="authenticator">
<li><a href="manageauth.xsl?mount={@mount}">Manage Authentication</a></li>
</xsl:if>
<li><a href="killsource.xsl?mount={@mount}">Kill Source</a></li>
</ul>
<xsl:choose> <xsl:choose>
<xsl:when test="listener"> <xsl:when test="listener">
<div class="scrolltable"> <table class="table-flipscroll">
<table class="colortable">
<thead> <thead>
<tr> <tr>
<td>IP</td> <th>IP</th>
<td>Username</td> <th>Username</th>
<td>Role</td> <th>Role</th>
<td>Sec. connected</td> <th>Sec. connected</th>
<td>User Agent</td> <th>User Agent</th>
<td>Action</td> <th>Action</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<xsl:variable name = "themount"><xsl:value-of select="@mount" /></xsl:variable>
<xsl:for-each select="listener"> <xsl:for-each select="listener">
<tr> <tr>
<td><xsl:value-of select="ip" /></td> <td><xsl:value-of select="ip" /></td>
@ -71,24 +47,25 @@
<td><xsl:value-of select="role" /></td> <td><xsl:value-of select="role" /></td>
<td><xsl:value-of select="connected" /></td> <td><xsl:value-of select="connected" /></td>
<td><xsl:value-of select="useragent" /></td> <td><xsl:value-of select="useragent" /></td>
<td><a href="killclient.xsl?mount={$themount}&amp;id={id}">Kick</a></td> <td><a href="killclient.xsl?mount={../@mount}&amp;id={id}">Kick</a></td>
</tr> </tr>
</xsl:for-each> </xsl:for-each>
</tbody> </tbody>
</table> </table>
</div>
</xsl:when> </xsl:when>
<xsl:otherwise> <xsl:otherwise>
<p>No listeners connected</p> <p>No listeners connected</p>
</xsl:otherwise> </xsl:otherwise>
</xsl:choose> </xsl:choose>
</div> </div>
</div>
</xsl:for-each> </xsl:for-each>
<div id="footer">
Support icecast development at <a href="http://www.icecast.org">www.icecast.org</a>
</div> </div>
</body>
</html> <!-- Footer -->
</xsl:template> <xsl:call-template name="footer" />
</body>
</html>
</xsl:template>
</xsl:stylesheet> </xsl:stylesheet>

View File

@ -1,61 +1,92 @@
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" > <xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0">
<xsl:output omit-xml-declaration="no" method="xml" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="yes" encoding="UTF-8" /> <xsl:output method="html" doctype-system="about:legacy-compat" encoding="UTF-8" />
<xsl:template match = "/icestats" > <!-- Import include files -->
<html xmlns="http://www.w3.org/1999/xhtml"> <xsl:include href="includes/head.xsl"/>
<head> <xsl:include href="includes/header.xsl"/>
<title>Icecast Streaming Media Server</title> <xsl:include href="includes/footer.xsl"/>
<link rel="stylesheet" type="text/css" href="/style.css" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" /> <xsl:include href="includes/mountnav.xsl"/>
</head>
<body> <!-- Auth template -->
<h1>Icecast2 Admin</h1> <xsl:template name="authlist">
<!--index header menu -->
<div id="menu">
<ul> <ul>
<li><a href="stats.xsl">Admin Home</a></li> <xsl:for-each select="authentication/role">
<li><a href="listmounts.xsl">Mountpoint List</a></li> <li>Role
<li><a href="/status.xsl">Public Home</a></li> <xsl:if test="@name">
<xsl:value-of select="@name" />
</xsl:if>
of type <xsl:value-of select="@type" />
<xsl:if test="@management-url">
<xsl:choose>
<xsl:when test="@can-adduser='true' or @can-deleteuser='true'">
(<a href="{@management-url}">Manage</a>)
</xsl:when>
<xsl:when test="@can-listuser='true'">
(<a href="{@management-url}">List</a>)
</xsl:when>
</xsl:choose>
</xsl:if>
</li>
</xsl:for-each>
</ul> </ul>
</div> </xsl:template>
<!--end index header menu -->
<xsl:template match="/icestats">
<html>
<xsl:call-template name="head">
<xsl:with-param name="title">Stats</xsl:with-param>
</xsl:call-template>
<body>
<!-- Header/Menu -->
<xsl:call-template name="header" />
<div class="section">
<h2>Active Mountpoints</h2> <h2>Active Mountpoints</h2>
<xsl:choose>
<xsl:when test="source">
<xsl:for-each select="source"> <xsl:for-each select="source">
<div class="roundbox"> <div class="article">
<div class="mounthead"> <h3>Mountpoint <xsl:value-of select="@mount" /></h3>
<h3 class="mount">Mountpoint <xsl:value-of select="@mount" /></h3> <!-- Mount nav -->
<div class="right"> <xsl:call-template name="mountnav" />
<h4>Play stream</h4>
<xsl:choose> <xsl:choose>
<xsl:when test="authenticator"> <xsl:when test="authenticator">
<a class="auth" href="/auth.xsl">Login</a> <a class="play" href="/auth.xsl">Auth</a>
</xsl:when> </xsl:when>
<xsl:otherwise> <xsl:otherwise>
<ul class="mountlist"> <a class="play" href="{@mount}.m3u">&#9658; <span>M3U</span></a>
<li><a class="play" href="{@mount}.m3u">M3U</a></li> <xsl:text> </xsl:text>
<li><a class="play" href="{@mount}.xspf">XSPF</a></li> <a class="play" href="{@mount}.xspf">&#9658; <span>XSPF</span></a>
<li><a class="play" href="{@mount}.vclt">VCLT</a></li> <xsl:text> </xsl:text>
</ul> <a class="play" href="{@mount}.vclt">&#9658; <span>VCLT</span></a>
</xsl:otherwise>
</xsl:choose>
<p><xsl:value-of select="listeners" /> Listener(s)</p>
<!-- Mount Authentication -->
<xsl:if test="authentication">
<h4>Mount Authentication</h4>
<xsl:call-template name="authlist" />
</xsl:if>
</div>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<div class="aside error">
<strong>No mounts!</strong> There are no active mountpoints.
</div>
</xsl:otherwise> </xsl:otherwise>
</xsl:choose> </xsl:choose>
</div> </div>
</div>
<div class="mountcont"> <!-- Footer -->
<ul class="nav"> <xsl:call-template name="footer" />
<li><a href="listclients.xsl?mount={@mount}">List Clients</a></li>
<li><a href="moveclients.xsl?mount={@mount}">Move Listeners</a></li> </body>
<li><a href="updatemetadata.xsl?mount={@mount}">Update Metadata</a></li> </html>
<xsl:if test="authenticator"> </xsl:template>
<li><a href="manageauth.xsl?mount={@mount}">Manage Authentication</a></li>
</xsl:if>
<li><a href="killsource.xsl?mount={@mount}">Kill Source</a></li>
</ul>
<p><xsl:value-of select="listeners" /> Listener(s)</p>
</div>
</div>
</xsl:for-each>
<div id="footer">
Support icecast development at <a href="http://www.icecast.org">www.icecast.org</a>
</div>
</body>
</html>
</xsl:template>
</xsl:stylesheet> </xsl:stylesheet>

View File

@ -1,92 +1,87 @@
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" > <xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0">
<xsl:output omit-xml-declaration="no" method="xml" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="yes" encoding="UTF-8" /> <xsl:output method="html" doctype-system="about:legacy-compat" encoding="UTF-8" />
<xsl:template match = "/icestats" > <!-- Import include files -->
<html xmlns="http://www.w3.org/1999/xhtml"> <xsl:include href="includes/head.xsl"/>
<head> <xsl:include href="includes/header.xsl"/>
<title>Icecast Streaming Media Server</title> <xsl:include href="includes/footer.xsl"/>
<link rel="stylesheet" type="text/css" href="/style.css" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" /> <xsl:include href="includes/mountnav.xsl"/>
</head>
<body> <xsl:template match="/icestats">
<h1>Icecast2 Admin</h1> <html>
<!--index header menu -->
<div id="menu"> <xsl:call-template name="head">
<ul> <xsl:with-param name="title">Stats</xsl:with-param>
<li><a href="stats.xsl">Admin Home</a></li> </xsl:call-template>
<li><a href="listmounts.xsl">Mountpoint List</a></li>
<li><a href="/status.xsl">Public Home</a></li> <body>
</ul> <!-- Header/Menu -->
</div> <xsl:call-template name="header" />
<!--end index header menu -->
<div class="section">
<h2>Manage Authentication</h2> <h2>Manage Authentication</h2>
<xsl:if test="iceresponse"> <xsl:if test="iceresponse">
<div class="roundbox"> <div class="aside error">
<h3>Message</h3> <xsl:value-of select="iceresponse/message" />
<xsl:for-each select="iceresponse">
<xsl:value-of select="message" /><br />
</xsl:for-each>
</div> </div>
</xsl:if> </xsl:if>
<xsl:for-each select="role"> <xsl:for-each select="role">
<div class="roundbox"> <div class="article">
<h3>Role <xsl:value-of select="@name" /> (<xsl:value-of select="@type" />) <h3>Role <xsl:value-of select="@name" /> (<xsl:value-of select="@type" />)
<xsl:if test="server_name"> <xsl:if test="server_name">
<small><xsl:value-of select="server_name" /></small> <xsl:text> </xsl:text><small><xsl:value-of select="server_name" /></small>
</xsl:if> </xsl:if>
</h3> </h3>
<xsl:if test="users"> <xsl:choose>
<table class="colortable"> <xsl:when test="users/user">
<table class="table-flipscroll">
<thead> <thead>
<tr> <tr>
<td>User</td> <th>User</th>
<td>Action</td> <xsl:if test="@can-deleteuser = 'true'">
<th>Action</th>
</xsl:if>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<xsl:for-each select="users/user"> <xsl:for-each select="users/user">
<tr> <tr>
<td><xsl:value-of select="username" /></td>
<xsl:if test="../../@can-deleteuser = 'true'">
<td> <td>
<xsl:value-of select="username" />
</td>
<td>
<xsl:choose>
<xsl:when test="../../@can-deleteuser = 'true'">
<a href="manageauth.xsl?id={../../@id}&amp;username={username}&amp;action=delete">Delete</a> <a href="manageauth.xsl?id={../../@id}&amp;username={username}&amp;action=delete">Delete</a>
</xsl:when>
<xsl:otherwise>
<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
</xsl:otherwise>
</xsl:choose>
</td> </td>
</xsl:if>
</tr> </tr>
</xsl:for-each> </xsl:for-each>
</tbody> </tbody>
</table> </table>
</xsl:if> </xsl:when>
<xsl:otherwise>
<p>No Users</p>
</xsl:otherwise>
</xsl:choose>
<!-- Form to add Users -->
<xsl:if test="@can-adduser = 'true'"> <xsl:if test="@can-adduser = 'true'">
<form class="alignedform" method="get" action="/admin/manageauth.xsl"> <h4>Add User</h4>
<fieldset> <form method="get" action="manageauth.xsl">
<legend>Add new user</legend> <label for="username" class="hidden">Username</label>
<p> <input type="text" id="username" name="username" value="" placeholder="Username" required="required" />
<label for="username">Username:</label> <label for="password" class="hidden">Password</label>
<input type="text" id="username" name="username"/> <input type="password" id="password" name="password" value="" placeholder="Password" required="required" />
</p>
<p>
<label for="password">Password:</label>
<input type="password" id="password" name="password"/>
</p>
<input type="hidden" name="id" value="{@id}"/> <input type="hidden" name="id" value="{@id}"/>
<input type="hidden" name="action" value="add"/> <input type="hidden" name="action" value="add"/>
<input type="Submit" value="Add"/> <input type="submit" value="Add new user" />
</fieldset>
</form> </form>
</xsl:if> </xsl:if>
</div> </div>
</xsl:for-each> </xsl:for-each>
<div id="footer">
Support icecast development at <a href="http://www.icecast.org">www.icecast.org</a>
</div> </div>
</body>
</html> <!-- Footer -->
</xsl:template> <xsl:call-template name="footer" />
</body>
</html>
</xsl:template>
</xsl:stylesheet> </xsl:stylesheet>

View File

@ -1,39 +1,63 @@
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" > <xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0">
<xsl:output omit-xml-declaration="no" method="xml" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="yes" encoding="UTF-8" /> <xsl:output method="html" doctype-system="about:legacy-compat" encoding="UTF-8" />
<xsl:template match = "/icestats" > <!-- Import include files -->
<html xmlns="http://www.w3.org/1999/xhtml"> <xsl:include href="includes/head.xsl"/>
<head> <xsl:include href="includes/header.xsl"/>
<title>Icecast Streaming Media Server</title> <xsl:include href="includes/footer.xsl"/>
<link rel="stylesheet" type="text/css" href="/style.css" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" /> <xsl:include href="includes/mountnav.xsl"/>
</head>
<body> <xsl:template match="/icestats">
<h1>Icecast2 Admin</h1> <html>
<!--index header menu -->
<div id="menu"> <xsl:call-template name="head">
<ul> <xsl:with-param name="title">Stats</xsl:with-param>
<li><a href="stats.xsl">Admin Home</a></li> </xsl:call-template>
<li><a href="listmounts.xsl">Mountpoint List</a></li>
<li><a href="/status.xsl">Public Home</a></li> <body>
</ul> <!-- Header/Menu -->
</div> <xsl:call-template name="header" />
<!--end index header menu -->
<xsl:variable name = "currentmount" ><xsl:value-of select="current_source" /></xsl:variable> <div class="section">
<h2>Moving listeners from <xsl:value-of select="current_source" /></h2> <h2>Move listeners</h2>
<div class="roundbox"> <div class="article">
<h3>Move to which mountpoint?</h3> <h3>Mountpoint <xsl:value-of select="current_source" /></h3>
<!-- Mount nav -->
<xsl:call-template name="mountnav">
<xsl:with-param name="mount" select="current_source"/>
</xsl:call-template>
<xsl:choose>
<xsl:when test="source">
<p>Choose the mountpoint to which you want to move the listeners to:</p>
<form method="get" action="moveclients.xsl">
<label for="moveto" class="hidden">
Move from <code><xsl:value-of select="current_source" /></code> to
</label>
<select name="destination" id="moveto">
<xsl:for-each select="source"> <xsl:for-each select="source">
<p> <option value="{@mount}">
Move from <code><xsl:copy-of select="$currentmount" /></code> to <code><xsl:value-of select="@mount" /></code><br /> <xsl:value-of select="@mount" />
<xsl:value-of select="listeners" /> listeners<br /> </option>
<a href="moveclients.xsl?mount={$currentmount}&amp;destination={@mount}">Move clients</a>
</p>
</xsl:for-each> </xsl:for-each>
</select>
<input type="hidden" name="mount" value="{current_source}" />
<input type="submit" value="Move listeners" />
</form>
</xsl:when>
<xsl:otherwise>
<p>
<strong>No mounts!</strong>
There are no other mountpoints you could move the listeners to.
</p>
</xsl:otherwise>
</xsl:choose>
</div> </div>
<div id="footer">
Support icecast development at <a href="http://www.icecast.org">www.icecast.org</a>
</div> </div>
</body>
</html> <!-- Footer -->
</xsl:template> <xsl:call-template name="footer" />
</body>
</html>
</xsl:template>
</xsl:stylesheet> </xsl:stylesheet>

View File

@ -1,35 +1,37 @@
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" > <xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0">
<xsl:output omit-xml-declaration="no" method="xml" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="yes" encoding="UTF-8" /> <xsl:output method="html" doctype-system="about:legacy-compat" encoding="UTF-8" />
<xsl:template match = "/iceresponse" > <!-- Import include files -->
<html xmlns="http://www.w3.org/1999/xhtml"> <xsl:include href="includes/head.xsl"/>
<head> <xsl:include href="includes/header.xsl"/>
<title>Icecast Streaming Media Server</title> <xsl:include href="includes/footer.xsl"/>
<link rel="stylesheet" type="text/css" href="/style.css" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" /> <xsl:template match="/iceresponse">
</head> <html>
<body>
<h1>Icecast2 Admin</h1> <xsl:call-template name="head">
<!--index header menu --> <xsl:with-param name="title">Stats</xsl:with-param>
<div id="menu"> </xsl:call-template>
<ul>
<li><a href="stats.xsl">Admin Home</a></li> <body>
<li><a href="listmounts.xsl">Mountpoint List</a></li> <!-- Header/Menu -->
<li><a href="/status.xsl">Public Home</a></li> <xsl:call-template name="header" />
</ul>
</div> <div class="section">
<!--end index header menu --> <h2>Server Response</h2>
<h2>Icecast Server Response</h2>
<xsl:for-each select="/iceresponse"> <xsl:for-each select="/iceresponse">
<div class="roundbox"> <div class="article">
<h3>Response</h3> <h3>Response</h3>
<p>Message: <xsl:value-of select="message" /></p> <h4>Message</h4>
<p>Return Code: <xsl:value-of select="return" /></p> <p><xsl:value-of select="message" /></p>
<p>(Return Code: <xsl:value-of select="return" />)</p>
</div> </div>
</xsl:for-each> </xsl:for-each>
<div id="footer">
Support icecast development at <a href="http://www.icecast.org">www.icecast.org</a>
</div> </div>
</body>
</html> <!-- Footer -->
</xsl:template> <xsl:call-template name="footer" />
</body>
</html>
</xsl:template>
</xsl:stylesheet> </xsl:stylesheet>

View File

@ -1,150 +1,144 @@
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" > <xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0">
<xsl:output omit-xml-declaration="no" method="xml" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="yes" encoding="UTF-8" /> <xsl:output method="html" doctype-system="about:legacy-compat" encoding="UTF-8" />
<xsl:template match = "/icestats" > <!-- Import include files -->
<html xmlns="http://www.w3.org/1999/xhtml"> <xsl:include href="includes/head.xsl"/>
<head> <xsl:include href="includes/header.xsl"/>
<title>Icecast Streaming Media Server</title> <xsl:include href="includes/footer.xsl"/>
<link rel="stylesheet" type="text/css" href="/style.css" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" /> <xsl:include href="includes/mountnav.xsl"/>
</head>
<body> <!-- Auth template -->
<h1>Icecast2 Admin</h1> <xsl:template name="authlist">
<!--index header menu -->
<div id="menu">
<ul>
<li><a href="stats.xsl">Admin Home</a></li>
<li><a href="listmounts.xsl">Mountpoint List</a></li>
<li><a href="/status.xsl">Public Home</a></li>
</ul>
</div>
<!--end index header menu -->
<!--global server stats-->
<div class="roundbox">
<h3>Global Server Stats</h3>
<ul class="nav">
<li><a href="reloadconfig.xsl">Reload Server Config</a></li>
</ul>
<table class="yellowkeys">
<tbody>
<xsl:for-each select="/icestats">
<xsl:for-each select="*">
<xsl:if test = "name()!='source'">
<tr>
<td><xsl:value-of select="name()" /></td>
<td><xsl:value-of select="." /></td>
</tr>
</xsl:if>
</xsl:for-each>
</xsl:for-each>
</tbody>
</table>
<xsl:if test="authentication">
<ul> <ul>
<xsl:for-each select="authentication/role"> <xsl:for-each select="authentication/role">
<li> <li>Role
Role
<xsl:if test="@name"> <xsl:if test="@name">
<xsl:value-of select="@name" /> <xsl:value-of select="@name" />
</xsl:if> </xsl:if>
of type <xsl:value-of select="@type" />: of type <xsl:value-of select="@type" />
<xsl:if test="@management-url"> <xsl:if test="@management-url">
<a href="{@management-url}">Manage Authentication</a> <xsl:choose>
<xsl:when test="@can-adduser='true' or @can-deleteuser='true'">
(<a href="{@management-url}">Manage</a>)
</xsl:when>
<xsl:when test="@can-listuser='true'">
(<a href="{@management-url}">List</a>)
</xsl:when>
</xsl:choose>
</xsl:if> </xsl:if>
</li> </li>
</xsl:for-each> </xsl:for-each>
</ul> </ul>
</xsl:if> </xsl:template>
</div>
<!--end global server stats-->
<!--mount point stats-->
<xsl:for-each select="source"> <xsl:template match="/icestats">
<xsl:if test = "listeners!=''"> <html>
<div class="roundbox">
<div class="mounthead"> <xsl:call-template name="head">
<h3 class="mount">Mountpoint <xsl:value-of select="@mount" /></h3> <xsl:with-param name="title">Stats</xsl:with-param>
<div class="right"> </xsl:call-template>
<xsl:choose>
<xsl:when test="authenticator"> <body>
<a class="auth" href="/auth.xsl">Login</a> <!-- Header/Menu -->
</xsl:when> <xsl:call-template name="header" />
<xsl:otherwise>
<ul class="mountlist"> <div class="section">
<li><a class="play" href="{@mount}.m3u">M3U</a></li> <h2>Administration</h2>
<li><a class="play" href="{@mount}.xspf">XSPF</a></li>
<li><a class="play" href="{@mount}.vclt">VCLT</a></li> <!-- Global stats table -->
</ul> <div class="article">
</xsl:otherwise> <h3>Global server stats</h3>
</xsl:choose> <table class="table-block">
</div> <thead>
</div> <tr>
<div class="mountcont"> <th>Key</th>
<ul class="nav"> <th>Value</th>
<li><a href="listclients.xsl?mount={@mount}">List Clients</a></li> </tr>
<li><a href="moveclients.xsl?mount={@mount}">Move Listeners</a></li> </thead>
<li><a href="updatemetadata.xsl?mount={@mount}">Update Metadata</a></li>
<xsl:if test="authenticator">
<li><a href="manageauth.xsl?mount={@mount}">Manage Authentication</a></li>
</xsl:if>
<li><a href="killsource.xsl?mount={@mount}">Kill Source</a></li>
</ul>
<xsl:if test="server_type and ((server_type = 'application/ogg') or (server_type = 'audio/ogg'))">
<div class="audioplayer">
<audio controls="controls" preload="none">
<source src="{@mount}" type="{server_type}" />
</audio>
</div>
</xsl:if>
<table class="yellowkeys">
<tbody> <tbody>
<xsl:for-each select="*"> <xsl:for-each select="/icestats/*[not(self::source) and not(self::authentication)]">
<xsl:if test="name() != 'metadata' and name() != 'authentication'">
<tr> <tr>
<td><xsl:value-of select="name()" /></td> <td><xsl:value-of select="name()" /></td>
<td><xsl:value-of select="." /></td> <td><xsl:value-of select="text()" /></td>
</tr> </tr>
</xsl:if>
</xsl:for-each> </xsl:for-each>
<xsl:if test="metadata"> </tbody>
</table>
<!-- Global Auth -->
<xsl:if test="authentication">
<h4>Authentication</h4>
<xsl:call-template name="authlist" />
</xsl:if>
</div>
<!-- Mount stats -->
<xsl:for-each select="source">
<div class="article">
<h3>Mountpoint <xsl:value-of select="@mount" /></h3>
<!-- Mount nav -->
<xsl:call-template name="mountnav" />
<h4>Play stream</h4>
<xsl:choose>
<xsl:when test="authenticator">
<a class="play" href="/auth.xsl">Auth</a>
</xsl:when>
<xsl:otherwise>
<a class="play" href="{@mount}.m3u">&#9658; <span>M3U</span></a>
<xsl:text> </xsl:text>
<a class="play" href="{@mount}.xspf">&#9658; <span>XSPF</span></a>
<xsl:text> </xsl:text>
<a class="play" href="{@mount}.vclt">&#9658; <span>VCLT</span></a>
</xsl:otherwise>
</xsl:choose>
<h4>Further information</h4>
<table class="table-block">
<thead>
<tr> <tr>
<th colspan="2">Extra metadata</th> <th>Key</th>
<th>Value</th>
</tr> </tr>
</thead>
<tbody>
<xsl:for-each select="*[not(self::metadata) and not(self::authentication)]">
<tr>
<td><xsl:value-of select="name()" /></td>
<td><xsl:value-of select="text()" /></td>
</tr>
</xsl:for-each>
</tbody>
</table>
<!-- Extra metadata -->
<xsl:if test="metadata/*">
<h4>Extra Metadata</h4>
<table class="table-block">
<tbody>
<xsl:for-each select="metadata/*"> <xsl:for-each select="metadata/*">
<tr> <tr>
<td><xsl:value-of select="name()" /></td> <td><xsl:value-of select="name()" /></td>
<td><xsl:value-of select="." /></td> <td><xsl:value-of select="text()" /></td>
</tr> </tr>
</xsl:for-each> </xsl:for-each>
</xsl:if>
</tbody> </tbody>
</table> </table>
</xsl:if>
<!-- Mount Authentication -->
<xsl:if test="authentication"> <xsl:if test="authentication">
<table> <h4>Mount Authentication</h4>
<ul> <xsl:call-template name="authlist" />
<xsl:for-each select="authentication/role">
<li>
Role
<xsl:if test="@name">
<xsl:value-of select="@name" />
</xsl:if> </xsl:if>
of type <xsl:value-of select="@type" />:
<xsl:if test="@management-url"> </div>
<a href="{@management-url}">Manage Authentication</a>
</xsl:if>
</li>
</xsl:for-each> </xsl:for-each>
</ul>
</table>
</xsl:if>
</div> </div>
</div>
</xsl:if> <!-- Footer -->
</xsl:for-each> <xsl:call-template name="footer" />
<!--end mount point stats-->
<div id="footer"> </body>
Support icecast development at <a href="http://www.icecast.org">www.icecast.org</a> </html>
</div> </xsl:template>
</body>
</html>
</xsl:template>
</xsl:stylesheet> </xsl:stylesheet>

View File

@ -1,49 +1,48 @@
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0"> <xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0">
<xsl:output omit-xml-declaration="no" method="xml" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" indent="yes" encoding="UTF-8" /> <xsl:output method="html" doctype-system="about:legacy-compat" encoding="UTF-8" indent="yes" />
<xsl:template match = "/icestats"> <!-- Import include files -->
<html xmlns="http://www.w3.org/1999/xhtml"> <xsl:include href="includes/head.xsl"/>
<head> <xsl:include href="includes/header.xsl"/>
<title>Icecast Streaming Media Server</title> <xsl:include href="includes/footer.xsl"/>
<link rel="stylesheet" type="text/css" href="/style.css" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" /> <xsl:include href="includes/mountnav.xsl"/>
</head>
<body> <xsl:template match="/icestats">
<h1>Icecast2 Admin</h1> <html>
<!--index header menu -->
<div id="menu"> <xsl:call-template name="head">
<ul> <xsl:with-param name="title">Stats</xsl:with-param>
<li><a href="stats.xsl">Admin Home</a></li> </xsl:call-template>
<li><a href="listmounts.xsl">Mountpoint List</a></li>
<li><a href="/status.xsl">Public Home</a></li> <body>
</ul> <!-- Header/Menu -->
</div> <xsl:call-template name="header" />
<!--end index header menu -->
<div class="section">
<h2>Update Metadata</h2> <h2>Update Metadata</h2>
<xsl:for-each select="source"> <xsl:for-each select="source">
<div class="roundbox"> <div class="article">
<h3>Mountpoint <xsl:value-of select="@mount" /> <h3>Mountpoint <xsl:value-of select="@mount" /></h3>
<xsl:if test="server_name"> <!-- Mount nav -->
<small><xsl:value-of select="server_name" /></small> <xsl:call-template name="mountnav" />
</xsl:if> <form method="get" action="/admin/metadata.xsl">
</h3> <label for="metadata" class="hidden">Metadata</label>
<form class="alignedform" method="get" action="/admin/metadata.xsl"> <input type="text" id="metadata" name="song" value="" placeholder="Click to edit" required="required" />
<p> <input type="hidden" name="mount" value="{@mount}" />
<label for="song">Metadata:</label> <input type="hidden" name="mode" value="updinfo" />
<input type="text" id="song" name="song"/> <input type="hidden" name="charset" value="UTF-8" />
</p> <input type="submit" value="Update Metadata" />
<p>
<input type="submit" value="Update"/>
<input type="hidden" name="mount" value="{@mount}"/>
<input type="hidden" name="mode" value="updinfo"/>
<input type="hidden" name="charset" value="UTF-8"/>
</p>
</form> </form>
</div> </div>
</xsl:for-each> </xsl:for-each>
<div id="footer">
Support icecast development at <a href="http://www.icecast.org">www.icecast.org</a>
</div> </div>
</body>
</html> <!-- Footer -->
</xsl:template> <xsl:call-template name="footer" />
</body>
</html>
</xsl:template>
</xsl:stylesheet> </xsl:stylesheet>

View File

@ -162,5 +162,6 @@ AC_OUTPUT([Makefile conf/Makefile src/Makefile src/common/avl/Makefile
src/common/httpp/Makefile src/common/thread/Makefile src/common/log/Makefile src/common/httpp/Makefile src/common/thread/Makefile src/common/log/Makefile
src/common/net/Makefile src/common/timing/Makefile doc/Makefile doc/img/Makefile src/common/net/Makefile src/common/timing/Makefile doc/Makefile doc/img/Makefile
doc/assets/Makefile doc/assets/css/Makefile doc/assets/font/Makefile doc/assets/Makefile doc/assets/css/Makefile doc/assets/font/Makefile
doc/assets/img/Makefile web/Makefile admin/Makefile win32/Makefile doc/assets/img/Makefile web/Makefile web/assets/Makefile web/assets/css/Makefile
web/assets/font/Makefile admin/Makefile admin/includes/Makefile win32/Makefile
win32/res/Makefile examples/Makefile]) win32/res/Makefile examples/Makefile])

View File

@ -2,6 +2,8 @@
AUTOMAKE_OPTIONS = foreign AUTOMAKE_OPTIONS = foreign
SUBDIRS = assets
webdir = $(pkgdatadir)/web webdir = $(pkgdatadir)/web
dist_web_DATA = status.xsl \ dist_web_DATA = status.xsl \
favicon.ico \ favicon.ico \

5
web/assets/Makefile.am Normal file
View File

@ -0,0 +1,5 @@
## Process this file with automake to produce Makefile.in
AUTOMAKE_OPTIONS = foreign
SUBDIRS = css font

View File

@ -0,0 +1,9 @@
## Process this file with automake to produce Makefile.in
AUTOMAKE_OPTIONS = foreign
otherwebdir = $(webdir)/assets/css
otherweb_DATA = style.css
EXTRA_DIST = $(otherweb_DATA)

981
web/assets/css/style.css Normal file
View File

@ -0,0 +1,981 @@
@charset "UTF-8";
/* Typeface */
@font-face {
font-family: 'FiraSans';
font-style: normal;
font-weight: normal;
src: url('../font/FiraSans-Regular.eot');
src: url('../font/FiraSans-Regular.eot?#iefix') format('embedded-opentype'), url('../font/FiraSans-Regular.woff') format('woff');
}
@font-face {
font-family: 'FiraSans';
font-style: italic;
font-weight: normal;
src: url('../font/FiraSans-Italic.eot');
src: url('../font/FiraSans-Italic.eot?#iefix') format('embedded-opentype'), url('../font/FiraSans-Italic.woff') format('woff');
}
@font-face {
font-family: 'FiraSans';
font-style: normal;
font-weight: bold;
src: url('fonts/FiraSans/FiraSans-Bold.eot');
src: url('../font/FiraSans-Bold.eot?#iefix') format('embedded-opentype'), url('../font/FiraSans-Bold.woff') format('woff');
}
@font-face {
font-family: 'FiraSans';
font-style: italic;
font-weight: bold;
src: url('../font/FiraSans-BoldItalic.eot');
src: url('../font/FiraSans-BoldItalic.eot?#iefix') format('embedded-opentype'), url('../font/FiraSans-BoldItalic.woff') format('woff');
}
@font-face {
font-family: 'FiraMono';
font-style: normal;
font-weight: normal;
src: url('../font/FiraMono-Regular.eot');
src: url('../font/FiraMono-Regular.eot?#iefix') format('embedded-opentype'), url('../font/FiraMono-Regular.woff') format('woff');
}
@font-face {
font-family: 'FiraMono';
font-style: normal;
font-weight: bold;
src: url('../font/FiraMono-Bold.eot');
src: url('../font/FiraMono-Bold.eot?#iefix') format('embedded-opentype'), url('../font/FiraMono-Bold.woff') format('woff');
}
/* General */
*,
*:before,
*:after {
font-family: 'FiraSans', sans-serif;
line-height: 1;
margin: 0;
padding: 0;
border: 0;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-rendering: optimizelegibility;
}
::selection {
background: #9AABB5;
color: #001826;
text-shadow: none;
}
::-moz-selection {
background: #9AABB5;
color: #001826;
text-shadow: none;
}
.hidden {
clip: rect(0 0 0 0);
overflow: hidden;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
position: absolute;
border: 0;
}
/* Typography */
h1,
h2,
h3,
h4 {
line-height: 1.25;
}
h1 {
font-size: 2em;
font-weight: normal;
}
h2 {
font-size: 2em;
}
h3 {
font-size: 1.5em;
}
h4 {
font-size: 1.25em;
}
h5 {
font-size: 1em;
text-transform: uppercase;
}
p,
li,
blockquote,
dl > *,
aside {
line-height: 1.6;
-webkit-hyphens: auto;
-moz-hyphens: auto;
hyphens: auto;
}
blockquote {
font-style: italic;
}
q {
quotes:"\201E" "\201C";
}
code,
pre {
background-color: #000E17;
color: #9AABB5;
font-family: 'FiraMono', monospace;
line-height: 1.6;
}
code {
word-break: break-all;
}
pre {
white-space: pre-wrap;
padding: 1em;
}
code span,
pre span {
font-family: 'FiraMono', monospace;
}
/* Chrome fix */
@media screen and (-webkit-min-device-pixel-ratio: 0) {
pre {
word-break: break-all;
}
}
hr {
padding-bottom: 1em;
margin-top: 2em;
clear: both;
border: 0;
border-top: 2px solid #29495C;
}
dt {
font-weight: bold;
}
dd {
margin-left: 1em;
}
/* Tables */
table {
width: 100%;
border-collapse: collapse;
border-spacing: 0;
}
th, td {
text-align: left;
line-height: 1.6;
padding: .5em;
vertical-align: top;
}
th {
background-color: #000E17;
text-shadow: 1px 1px 0 rgba(0,0,0,0.5);
}
td {
border: 2px solid #000E17;
}
td a {
word-break: break-all;
}
/* Inputs */
::-webkit-input-placeholder {
color: #9AABB5;
}
:-moz-placeholder {
color: #9AABB5;
opacity: 1;
}
::-moz-placeholder {
color: #9AABB5;
opacity: 1;
}
:-ms-input-placeholder {
color: #9AABB5;
}
input::-ms-clear {
display: none;
}
input:not([type="submit"]), textarea {
font: 1em 'FiraMono', monospace
}
input, textarea {
width: 50%;
}
input[type='text'],
input[type='email'],
input[type='password'],
input[type='url'] {
background-color: #000E17;
color: #9AABB5;
display: block;
padding: 1em;
}
input[type='submit'] {
background-color: #001826;
font-size: 1em;
color: #FFFFFF;
display: block;
padding: 1em;
border: 2px solid #29495C;
}
input[type='submit']:hover {
background-color: #29495C;
cursor: pointer;
}
input[type='checkbox'] + label {
display: inline-block !important;
margin: 10px 0 0 10px;
}
form > *:not(:last-child) {
margin-bottom: 1em;
}
/* Links */
a:link,
a:visited {
color: #9AABB5;
text-decoration: underline;
}
a:hover,
a:focus,
a:active {
color: #29495C;
}
a.permalink:link,
a.permalink:visited {
text-decoration: none;
display: none;
}
a.permalink:hover,
*:hover > a.permalink {
display: inline-block;
padding-left: .25em;
}
/* Body */
body {
background-color: #CAD5DB;
color: #001826;
}
body > * {
margin: 0 auto;
}
body > *:not(:first-child) {
width: 75%;
margin: 0 auto;
}
/* Header */
header,
.header {
background-color: #001826;
position: relative;
margin-bottom: 2em;
box-shadow: 0 0 2em rgba(0,0,0,0.5) inset;
}
#xiphbar {
background-color: #666666;
height: 2.25em;
box-shadow: 0 .25em .25em rgba(0,0,0,.5);
}
#xiphbar > div {
width: 75%;
margin: 0 auto;
position: relative;
}
#xiphbar > div > * {
position: absolute;
top: 0.5em;
}
#xiphbar > div > a {
display: block;
}
#xiphbar img {
width: auto;
height: 1.25em;
}
#xiphbar > div > ul {
right: 0;
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: flex;
flex-direction: row;
list-style: none;
}
#xiphbar li {
font-size: 14px;
margin: 0;
}
#xiphbar li:not(:first-child) {
margin-left: 1em;
}
#xiphbar a:link,
#xiphbar a:visited {
color: #ffcc66;
text-decoration: none;
text-transform: uppercase;
border: none;
}
#xiphbar a:hover,
#xiphbar a:focus {
color: #ffe6b3;
}
#xiphbar a:active {
color: #FFFFFF;
}
header h1,
.header h1 {
color: #29495C;
text-shadow: 1px 1px 0 rgba(0,0,0,0.5);
width: 75%;
padding: 2em 0;
margin: 0 auto;
}
header h1 a:link,
header h1 a:visited,
.header h1 a:link,
.header h1 a:visited {
color: #FFFFFF;
font-weight: bold;
text-decoration: none;
border-bottom: none;
}
header h1 a:hover,
header h1 a:focus,
.header h1 a:hover,
.header h1 a:focus {
text-decoration: underline;
}
header h1 a:active,
.header h1 a:active {
color: #29495C;
}
/* Navigation */
nav,
.nav {
margin: 0 auto;
border-top: 2px solid #29495C;
border-bottom: 2px solid #29495C;
}
nav label,
.nav label,
#toggle-nav {
display: none;
}
nav label:before,
.nav label:before {
content: '\2261';
color: #29495C;
font-size: 4em;
text-shadow: 1px 1px 0 rgba(0,0,0,0.5);
position: absolute;
top: 0.9em;
right: 0.5em;
}
nav label.nobar:before,
.nav label.nobar:before {
top: 0.4em;
}
nav label:hover,
nav label:hover:before,
.nav label:hover,
.nav label:hover:before {
color: #FFFFFF;
cursor: pointer;
}
#toggle-nav:checked + ul {
display: block;
}
nav ul,
.nav ul {
margin: 0 auto;
}
nav ul:before,
nav ul:after,
.nav ul:before,
.nav ul:after {
display: table;
content: ' ';
clear: both;
}
nav li,
.nav li {
display: table-cell;
width: 1%;
}
nav li.on a,
.nav li.on a {
font-weight: bold;
}
nav a:link,
nav a:visited,
.nav a:link,
.nav a:visited {
background-color: #001826;
color: #FFFFFF
;letter-spacing: 0.1em;
white-space: nowrap;
text-transform: uppercase;
text-decoration: none;
text-align: center;
padding: 1em;
display: block;
border-right: 2px solid #29495C;
border-bottom: none;
position: relative;
}
nav li:last-child a,
.nav li:last-child a {
border-right: none;
}
nav a:after,
.nav a:after {
content: '\0020';
color: transparent;
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
opacity: 0;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
filter: alpha(opacity=0);
border: 5px solid #29495C;
}
nav a:focus,
.nav a:focus {
color: #29495C;
}
nav a:hover:after,
nav a:active:after,
nav a:focus:after,
.nav a:hover:after,
.nav a:active:after,
.nav a:focus:after {
opacity: 1;
-ms-filter: none;
filter: none;
}
/* Content */
section h2,
.section h2 {
margin-bottom: 1em;
}
section > a:link,
section > a:visited,
.section > a:link,
.section > a:visited {
color: #29495C;
}
section > a:hover,
.section > a:hover {
text-decoration: none;
}
.error {
background-color: #DBCAD5;
color: #5C2949;
padding: .5em 2em;
margin: -1em 0 1em 0;
border: 1px solid #5C2949;
}
.error a {
color: #5C2949;
}
.error a:hover {
text-decoration: none;
}
section > article:not(:last-child),
.section > .article:not(:last-child) {
margin-bottom: 2em;
}
article,
.article {
background-color: #001826;
color: #FFFFFF;
padding: 2em;
}
article h3,
.article h3 {
text-shadow: 1px 1px 0 rgba(0,0,0,0.5);
margin-bottom: 0.7em;
border-bottom: 2px solid #29495C;
}
article h4,
article h5,
.article h4,
.article h5 {
margin-top: 2em;
}
article h3 + h4,
article h3 + h5,
.article h3 + h4,
.article h3 + h5 {
margin-top: 0;
}
article > *:not(:last-child),
.article > *:not(:last-child) {
margin-bottom: 1em;
}
article img,
.article img {
max-width: 100%;
}
article ul,
.article ul {
padding-left: 1em;
margin-top: 1em;
}
article li > ul,
.article li > ul {
margin-top: 0;
}
article nav,
.article .nav {
border-right: 2px solid #29495C;
border-left: 2px solid #29495C;
}
article nav ul,
.article .nav ul {
padding: 0;
margin-top: 0;
}
article aside,
.article .aside {
color: #29495C;
text-align: center;
letter-spacing: 0.1em;
text-transform: uppercase;
padding: 1em 2em 0 2em;
margin: 2em -2em -1em -2em;
border-top: 2px solid #29495C;
}
article aside a:link,
article aside a:visited,
.article .aside a:link,
.article .aside a:visited {
font-weight: bold;
text-decoration: none;
}
.play:link,
.play:visited {
background-color: #000E17;
color: #FFFFFF;
text-decoration: none;
white-space: nowrap;
display: inline-block;
padding: 1em;
}
.play:hover,
.play:active,
.play:focus {
color: #9AABB5;
}
.play span {
font-weight: bold;
}
ul.buttons {
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
-webkit-flex-flow: row;
flex-direction: row;
-webkit-box-pack: justify;
-moz-box-pack: justify;
-webkit-justify-content: space-between;
-ms-flex-pack: justify;
justify-content: space-between;
padding: 0;
list-style: none;
}
ul.buttons li {
width: 49%;
}
ul.buttons a {
background-color: #000E17;
color: #FFFFFF;
font-size: 1.25em;
font-weight: bold;
text-decoration: none;
display: block;
padding: 1em;
}
ul.buttons a:hover {
text-decoration: underline;
}
ul.buttons .linux {
background: #000E17 url('../img/logo-linux.svg') no-repeat 95% 50%;
background-size: 2em;
}
ul.buttons .windows {
background: #000E17 url('../img/logo-windows.svg') no-repeat 95% 50%;
background-size: 2em;
}
ul.buttons span {
display: inline-block;
margin-top: 1em;
}
/* Footer */
footer,
.footer {
text-align: center;
padding: 2em 0;
}
footer a:link,
footer a:visited,
.footer a:link,
.footer a:visited {
color: #29495C;
}
/* Desktop and tablet */
@media only screen and (max-width: 1024px) {
#xiphbar > div > a {
text-align: center;
position: static;
padding-top: 0.5em;
}
#xiphbar > div > ul {
display: none;
}
article nav ul:before,
.article .nav ul:before,
nav ul:after,
.nav ul:after {
display: block;
}
article nav li,
.article .nav li {
display: block;
width: auto;
}
article nav a:after,
.article .nav a:after {
border-right: 7px solid #29495C;
border-left: 7px solid #29495C;
}
article nav li:not(:last-child) a,
.article .nav li:not(:last-child) a {
border-right: none;
border-bottom: 2px solid #29495C;
}
ul.buttons {
-webkit-flex-flow: column;
flex-direction: column;
}
ul.buttons li {
width: 100%;
}
ul.buttons li:not(:last-child) {
margin-bottom: 1em;
}
}
/* Tablet and smartphone */
@media only screen and (max-width: 768px) {
* {
-ms-text-size-adjust: 100%;
-webkit-text-size-adjust: 100%;
}
input, textarea {
width: 100%;
}
.table-block {
word-break: break-all;
}
.table-block thead {
display: none;
}
.table-block td {
display: block;
}
.table-block tr td:first-child {
font-weight: bold;
padding-bottom: 0;
border-bottom: none;
}
.table-block tr td:last-child {
border-top: none;
}
.table-block tr:not(:last-child) td:last-child {
border-bottom: none;
}
.table-flipscroll {
display: block;
width: 100%;
position: relative;
}
.table-flipscroll:after {
content: ' ';
background-image: -ms-linear-gradient(left, transparent 0%, #001826 100%);
background-image: -moz-linear-gradient(left, transparent 0%, #001826 100%);
background-image: -o-linear-gradient(left, transparent 0%, #001826 100%);
background-image: -webkit-gradient(linear, left top, right top, color-stop(0, transparent), color-stop(1, #001826));
background-image: -webkit-linear-gradient(left, transparent 0%, #001826 100%);
background-image: linear-gradient(to right, transparent 0%, #001826 100%);
position: absolute;
top: 0;
right: 0;
width: 2em;
height: 100%;
}
.table-flipscroll thead {
display: block;
float: left;
}
.table-flipscroll thead tr {
display: block;
}
.table-flipscroll th {
white-space: nowrap;
text-align: right;
display: block;
border-bottom: 3px solid #000E17;
}
.table-flipscroll tbody {
white-space: nowrap;
display: block;
width: auto;
position: relative;
overflow-x: auto;
}
.table-flipscroll tbody tr {
display: inline-block;
vertical-align: top;
}
.table-flipscroll tbody tr:first-child td {
border-left: none;
}
.table-flipscroll tbody tr:not(:last-child) td {
border-right: none;
}
.table-flipscroll td {
text-align: left;
display: block;
border-bottom: none;
}
.table-flipscroll td:last-child {
border-bottom: 2px solid #000E17;
}
nav,
.nav {
width: auto;
}
nav ul:before,
nav ul:after,
.nav ul:before,
.nav ul:after {
display: block;
}
nav li,
.nav li {
display: block;
width: auto;
}
nav a:after,
nav a:after,
.nav a:after,
.nav a:after {
border-right: 7px solid #29495C;
border-left: 7px solid #29495C;
}
nav li:not(:last-child) a,
.nav li:not(:last-child) a {
border-right: none;
border-bottom: 2px solid #29495C;
}
}
/* Smartphone */
@media only screen and (max-width: 450px) {
body > *:not(:first-child) {
width: 100%;
}
#xiphbar > div {
width: 100%;
padding: 0 2em;
}
#xiphbar > div > a {
text-align: left;
}
#xiphbar img {
max-width: 100%;
}
header h1,
.header h1 {
line-height: 1;
padding: 1em;
width: auto;
}
header h1 span,
.header h1 span {
display: none;
}
header nav label,
.header nav label {
display: block;
}
header nav ul,
.header nav ul {
display: none;
}
section h2,
section > p,
.section h2,
.section > p {
padding: 0 1em;
}
.error {
border-right: none;
border-left: none;
}
article > *:not(:first-child):not(.buttons),
.article > *:not(:first-child):not(.buttons) {
text-align: justify;
}
.play {
width: 100%;
}
footer,
.footer {
padding: 2em;
}
}
/* Print */
@media print {
* {
background-color: #FFFFFF !important;
color: #000000 !important;
text-shadow: none !important;
text-align: left !important;
border: none;
width: 100% !important;
}
h1,
h2,
h3 {
font-size: 1.25em;
}
h3,
h4 {
page-break-after: avoid;
}
pre {
page-break-inside: avoid;
}
table:after {
display: none;
}
th,
td {
width: auto !important;
border: 1px solid #000000;
}
#xiphbar,
nav,
.nav {
display: none;
}
header,
.header {
box-shadow: none;
margin: 0;
}
article,
.article {
padding: 0 1em;
}
article h3,
.article h3 {
border-bottom: none;
}
article a:after,
.article a:after {
content: ' [' attr(href) ']';
}
article aside,
.article aside {
text-transform: none;
padding: 0;
margin: 0;
border-top: none;
}
}
/* Highlight (Solarized Dark) */
.highlight{background-color:#073642;color:#93a1a1}
.highlight .c{color:#586e75 !important;}
.highlight .cm{color:#586e75 !important;}
.highlight .cp{color:#586e75 !important;}
.highlight .c1{color:#586e75 !important;}
.highlight .cs{color:#586e75 !important;font-weight:bold !important;}
.highlight .err{color:#dc322f !important;background:none !important;}
.highlight .k{color:#cb4b16 !important}
.highlight .o{color:#93a1a1 !important;font-weight:bold !important;}
.highlight .p{color:#93a1a1 !important}
.highlight .ow{color:#2aa198 !important;font-weight:bold !important;}
.highlight .gd{color:#93a1a1 !important;background-color:#372c34 !important;display:inline-block;}
.highlight .gd .x{color:#93a1a1 !important;background-color:#4d2d33 !important;display:inline-block;}
.highlight .ge{color:#93a1a1 !important;}
.highlight .gr{color:#aa0000}
.highlight .gh{color:#586e75 !important;}
.highlight .gi{color:#93a1a1 !important;background-color:#1a412b !important;display:inline-block;}
.highlight .gi .x{color:#93a1a1 !important;background-color:#355720 !important;display:inline-block;}
.highlight .go{color:#888888;}
.highlight .gp{color:#555555;}
.highlight .gs{color:#93a1a1 !important;font-weight:bold !important;}
.highlight .gu{color:#6c71c4 !important;}
.highlight .gt{color:#aa0000;}
.highlight .kc{color:#859900 !important;font-weight:bold !important;}
.highlight .kd{color:#268bd2 !important;}
.highlight .kp{color:#cb4b16 !important;font-weight:bold !important;}
.highlight .kr{color:#d33682 !important;font-weight:bold !important;}
.highlight .kt{color:#2aa198 !important;}
.highlight .n{color:#268bd2 !important;}
.highlight .na{color:#268bd2 !important;}
.highlight .nb{color:#859900 !important;}
.highlight .nc{color:#d33682 !important;}
.highlight .no{color:#b58900 !important;}
.highlight .ni{color:#800080;}
.highlight .nl{color:#859900 !important;}
.highlight .ne{color:#268bd2 !important;font-weight:bold !important;}
.highlight .nf{color:#268bd2 !important;font-weight:bold !important;}
.highlight .nn{color:#b58900 !important;}
.highlight .nt{color:#268bd2 !important;font-weight:bold !important;}
.highlight .nx{color:#b58900 !important;}
.highlight .bp{color:#999999;}
.highlight .vc{color:#008080;}
.highlight .vg{color:#268bd2 !important;}
.highlight .vi{color:#268bd2 !important;}
.highlight .nv{color:#268bd2 !important;}
.highlight .w{color:#bbbbbb;}
.highlight .mf{color:#2aa198 !important;}
.highlight .m{color:#2aa198 !important;}
.highlight .mh{color:#2aa198 !important;}
.highlight .mi{color:#2aa198 !important;}
.highlight .mo{color:#009999;}
.highlight .s{color:#2aa198 !important;}
.highlight .sb{color:#d14;}
.highlight .sc{color:#d14;}
.highlight .sd{color:#2aa198 !important;}
.highlight .s2{color:#2aa198 !important;}
.highlight .se{color:#dc322f !important;}
.highlight .sh{color:#d14;}
.highlight .si{color:#268bd2 !important;}
.highlight .sx{color:#d14;}
.highlight .sr{color:#2aa198 !important;}
.highlight .s1{color:#2aa198 !important;}
.highlight .ss{color:#990073;}
.highlight .il{color:#009999;}
.highlight div .gd,.highlight div .gd .x,.highlight div .gi,.highlight div .gi .x{display:inline-block;width:100%;}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,14 @@
## Process this file with automake to produce Makefile.in
AUTOMAKE_OPTIONS = foreign
otherwebdir = $(webdir)/assets/font
otherweb_DATA = FiraMono-Bold.eot FiraMono-Regular.eot \
FiraSans-Bold.eot FiraSans-BoldItalic.woff \
FiraSans-Italic.eot FiraSans-Regular.eot \
FiraMono-Bold.woff FiraMono-Regular.woff \
FiraSans-BoldItalic.eot FiraSans-Bold.woff \
FiraSans-Italic.woff FiraSans-Regular.woff
EXTRA_DIST = $(otherweb_DATA)