mirror of
https://gitlab.xiph.org/xiph/icecast-server.git
synced 2024-12-04 14:46:30 -05:00
Preparations for new webinterface design
This commit is contained in:
parent
490482deaf
commit
1d8e128320
@ -2,6 +2,8 @@
|
||||
|
||||
AUTOMAKE_OPTIONS = foreign
|
||||
|
||||
SUBDIRS = includes
|
||||
|
||||
admindir = $(pkgdatadir)/admin
|
||||
dist_admin_DATA = listclients.xsl listmounts.xsl moveclients.xsl response.xsl \
|
||||
stats.xsl manageauth.xsl updatemetadata.xsl xspf.xsl vclt.xsl
|
||||
|
8
admin/includes/Makefile.am
Normal file
8
admin/includes/Makefile.am
Normal 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
10
admin/includes/footer.xsl
Normal 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
12
admin/includes/head.xsl
Normal 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
23
admin/includes/header.xsl
Normal 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>
|
14
admin/includes/mountnav.xsl
Normal file
14
admin/includes/mountnav.xsl
Normal 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>
|
@ -1,94 +1,71 @@
|
||||
<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:template match = "/icestats" >
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>Icecast Streaming Media Server</title>
|
||||
<link rel="stylesheet" type="text/css" href="/style.css" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
||||
</head>
|
||||
<body>
|
||||
<h1>Icecast2 Admin</h1>
|
||||
<!--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 -->
|
||||
<h2>Listener Stats</h2>
|
||||
<xsl:for-each select="source">
|
||||
<div class="roundbox">
|
||||
<div class="mounthead">
|
||||
<h3>Mountpoint <xsl:value-of select="@mount" /></h3>
|
||||
<div class="right">
|
||||
<xsl:choose>
|
||||
<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:when test="listener">
|
||||
<div class="scrolltable">
|
||||
<table class="colortable">
|
||||
<thead>
|
||||
<tr>
|
||||
<td>IP</td>
|
||||
<td>Username</td>
|
||||
<td>Role</td>
|
||||
<td>Sec. connected</td>
|
||||
<td>User Agent</td>
|
||||
<td>Action</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<xsl:variable name = "themount"><xsl:value-of select="@mount" /></xsl:variable>
|
||||
<xsl:for-each select="listener">
|
||||
<tr>
|
||||
<td><xsl:value-of select="ip" /></td>
|
||||
<td><xsl:value-of select="username" /></td>
|
||||
<td><xsl:value-of select="role" /></td>
|
||||
<td><xsl:value-of select="connected" /></td>
|
||||
<td><xsl:value-of select="useragent" /></td>
|
||||
<td><a href="killclient.xsl?mount={$themount}&id={id}">Kick</a></td>
|
||||
</tr>
|
||||
</xsl:for-each>
|
||||
</tbody>
|
||||
</table>
|
||||
<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" />
|
||||
<!-- Import include files -->
|
||||
<xsl:include href="includes/head.xsl"/>
|
||||
<xsl:include href="includes/header.xsl"/>
|
||||
<xsl:include href="includes/footer.xsl"/>
|
||||
|
||||
<xsl:include href="includes/mountnav.xsl"/>
|
||||
|
||||
<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>Listener Stats</h2>
|
||||
|
||||
<xsl:for-each select="source">
|
||||
<div class="article">
|
||||
<h3>Mountpoint <xsl:value-of select="@mount" /></h3>
|
||||
<!-- Mount nav -->
|
||||
<xsl:call-template name="mountnav" />
|
||||
<xsl:choose>
|
||||
<xsl:when test="listener">
|
||||
<table class="table-flipscroll">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>IP</th>
|
||||
<th>Username</th>
|
||||
<th>Role</th>
|
||||
<th>Sec. connected</th>
|
||||
<th>User Agent</th>
|
||||
<th>Action</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<xsl:for-each select="listener">
|
||||
<tr>
|
||||
<td><xsl:value-of select="ip" /></td>
|
||||
<td><xsl:value-of select="username" /></td>
|
||||
<td><xsl:value-of select="role" /></td>
|
||||
<td><xsl:value-of select="connected" /></td>
|
||||
<td><xsl:value-of select="useragent" /></td>
|
||||
<td><a href="killclient.xsl?mount={../@mount}&id={id}">Kick</a></td>
|
||||
</tr>
|
||||
</xsl:for-each>
|
||||
</tbody>
|
||||
</table>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<p>No listeners connected</p>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</div>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<p>No listeners connected</p>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</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:for-each>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- Footer -->
|
||||
<xsl:call-template name="footer" />
|
||||
|
||||
</body>
|
||||
</html>
|
||||
</xsl:template>
|
||||
</xsl:stylesheet>
|
@ -1,61 +1,92 @@
|
||||
<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:template match = "/icestats" >
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>Icecast Streaming Media Server</title>
|
||||
<link rel="stylesheet" type="text/css" href="/style.css" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
||||
</head>
|
||||
<body>
|
||||
<h1>Icecast2 Admin</h1>
|
||||
<!--index header menu -->
|
||||
<div id="menu">
|
||||
<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" />
|
||||
<!-- Import include files -->
|
||||
<xsl:include href="includes/head.xsl"/>
|
||||
<xsl:include href="includes/header.xsl"/>
|
||||
<xsl:include href="includes/footer.xsl"/>
|
||||
|
||||
<xsl:include href="includes/mountnav.xsl"/>
|
||||
|
||||
<!-- Auth template -->
|
||||
<xsl:template name="authlist">
|
||||
<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>
|
||||
<xsl:for-each select="authentication/role">
|
||||
<li>Role
|
||||
<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>
|
||||
</div>
|
||||
<!--end index header menu -->
|
||||
<h2>Active Mountpoints</h2>
|
||||
<xsl:for-each select="source">
|
||||
<div class="roundbox">
|
||||
<div class="mounthead">
|
||||
<h3 class="mount">Mountpoint <xsl:value-of select="@mount" /></h3>
|
||||
<div class="right">
|
||||
</xsl:template>
|
||||
|
||||
|
||||
<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>
|
||||
<xsl:choose>
|
||||
<xsl:when test="authenticator">
|
||||
<a class="auth" href="/auth.xsl">Login</a>
|
||||
<xsl:when test="source">
|
||||
<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">► <span>M3U</span></a>
|
||||
<xsl:text> </xsl:text>
|
||||
<a class="play" href="{@mount}.xspf">► <span>XSPF</span></a>
|
||||
<xsl:text> </xsl:text>
|
||||
<a class="play" href="{@mount}.vclt">► <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>
|
||||
<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>
|
||||
<div class="aside error">
|
||||
<strong>No mounts!</strong> There are no active mountpoints.
|
||||
</div>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mountcont">
|
||||
<ul class="nav">
|
||||
<li><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>
|
||||
<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>
|
||||
|
||||
<!-- Footer -->
|
||||
<xsl:call-template name="footer" />
|
||||
|
||||
</body>
|
||||
</html>
|
||||
</xsl:template>
|
||||
</xsl:stylesheet>
|
@ -1,92 +1,87 @@
|
||||
<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:template match = "/icestats" >
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>Icecast Streaming Media Server</title>
|
||||
<link rel="stylesheet" type="text/css" href="/style.css" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
||||
</head>
|
||||
<body>
|
||||
<h1>Icecast2 Admin</h1>
|
||||
<!--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 -->
|
||||
<h2>Manage Authentication</h2>
|
||||
<xsl:if test="iceresponse">
|
||||
<div class="roundbox">
|
||||
<h3>Message</h3>
|
||||
<xsl:for-each select="iceresponse">
|
||||
<xsl:value-of select="message" /><br />
|
||||
</xsl:for-each>
|
||||
</div>
|
||||
</xsl:if>
|
||||
<xsl:for-each select="role">
|
||||
<div class="roundbox">
|
||||
<h3>Role <xsl:value-of select="@name" /> (<xsl:value-of select="@type" />)
|
||||
<xsl:if test="server_name">
|
||||
<small><xsl:value-of select="server_name" /></small>
|
||||
</xsl:if>
|
||||
</h3>
|
||||
<xsl:if test="users">
|
||||
<table class="colortable">
|
||||
<thead>
|
||||
<tr>
|
||||
<td>User</td>
|
||||
<td>Action</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<xsl:for-each select="users/user">
|
||||
<tr>
|
||||
<td>
|
||||
<xsl:value-of select="username" />
|
||||
</td>
|
||||
<td>
|
||||
<xsl:choose>
|
||||
<xsl:when test="../../@can-deleteuser = 'true'">
|
||||
<a href="manageauth.xsl?id={../../@id}&username={username}&action=delete">Delete</a>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:text disable-output-escaping="yes">&nbsp;</xsl:text>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</td>
|
||||
</tr>
|
||||
</xsl:for-each>
|
||||
</tbody>
|
||||
</table>
|
||||
</xsl:if>
|
||||
<xsl:if test="@can-adduser = 'true'">
|
||||
<form class="alignedform" method="get" action="/admin/manageauth.xsl">
|
||||
<fieldset>
|
||||
<legend>Add new user</legend>
|
||||
<p>
|
||||
<label for="username">Username:</label>
|
||||
<input type="text" id="username" name="username"/>
|
||||
</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="action" value="add"/>
|
||||
<input type="Submit" value="Add"/>
|
||||
</fieldset>
|
||||
</form>
|
||||
</xsl:if>
|
||||
</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 xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0">
|
||||
<xsl:output method="html" doctype-system="about:legacy-compat" encoding="UTF-8" />
|
||||
<!-- Import include files -->
|
||||
<xsl:include href="includes/head.xsl"/>
|
||||
<xsl:include href="includes/header.xsl"/>
|
||||
<xsl:include href="includes/footer.xsl"/>
|
||||
|
||||
<xsl:include href="includes/mountnav.xsl"/>
|
||||
|
||||
<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>Manage Authentication</h2>
|
||||
<xsl:if test="iceresponse">
|
||||
<div class="aside error">
|
||||
<xsl:value-of select="iceresponse/message" />
|
||||
</div>
|
||||
</xsl:if>
|
||||
<xsl:for-each select="role">
|
||||
<div class="article">
|
||||
<h3>Role <xsl:value-of select="@name" /> (<xsl:value-of select="@type" />)
|
||||
<xsl:if test="server_name">
|
||||
<xsl:text> </xsl:text><small><xsl:value-of select="server_name" /></small>
|
||||
</xsl:if>
|
||||
</h3>
|
||||
<xsl:choose>
|
||||
<xsl:when test="users/user">
|
||||
<table class="table-flipscroll">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>User</th>
|
||||
<xsl:if test="@can-deleteuser = 'true'">
|
||||
<th>Action</th>
|
||||
</xsl:if>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<xsl:for-each select="users/user">
|
||||
<tr>
|
||||
<td><xsl:value-of select="username" /></td>
|
||||
<xsl:if test="../../@can-deleteuser = 'true'">
|
||||
<td>
|
||||
<a href="manageauth.xsl?id={../../@id}&username={username}&action=delete">Delete</a>
|
||||
</td>
|
||||
</xsl:if>
|
||||
</tr>
|
||||
</xsl:for-each>
|
||||
</tbody>
|
||||
</table>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<p>No Users</p>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
<!-- Form to add Users -->
|
||||
<xsl:if test="@can-adduser = 'true'">
|
||||
<h4>Add User</h4>
|
||||
<form method="get" action="manageauth.xsl">
|
||||
<label for="username" class="hidden">Username</label>
|
||||
<input type="text" id="username" name="username" value="" placeholder="Username" required="required" />
|
||||
<label for="password" class="hidden">Password</label>
|
||||
<input type="password" id="password" name="password" value="" placeholder="Password" required="required" />
|
||||
<input type="hidden" name="id" value="{@id}"/>
|
||||
<input type="hidden" name="action" value="add"/>
|
||||
<input type="submit" value="Add new user" />
|
||||
</form>
|
||||
</xsl:if>
|
||||
</div>
|
||||
</xsl:for-each>
|
||||
</div>
|
||||
|
||||
<!-- Footer -->
|
||||
<xsl:call-template name="footer" />
|
||||
|
||||
</body>
|
||||
</html>
|
||||
</xsl:template>
|
||||
</xsl:stylesheet>
|
@ -1,39 +1,63 @@
|
||||
<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:template match = "/icestats" >
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>Icecast Streaming Media Server</title>
|
||||
<link rel="stylesheet" type="text/css" href="/style.css" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
||||
</head>
|
||||
<body>
|
||||
<h1>Icecast2 Admin</h1>
|
||||
<!--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 -->
|
||||
<xsl:variable name = "currentmount" ><xsl:value-of select="current_source" /></xsl:variable>
|
||||
<h2>Moving listeners from <xsl:value-of select="current_source" /></h2>
|
||||
<div class="roundbox">
|
||||
<h3>Move to which mountpoint?</h3>
|
||||
<xsl:for-each select="source">
|
||||
<p>
|
||||
Move from <code><xsl:copy-of select="$currentmount" /></code> to <code><xsl:value-of select="@mount" /></code><br />
|
||||
<xsl:value-of select="listeners" /> listeners<br />
|
||||
<a href="moveclients.xsl?mount={$currentmount}&destination={@mount}">Move clients</a>
|
||||
</p>
|
||||
</xsl:for-each>
|
||||
</div>
|
||||
<div id="footer">
|
||||
Support icecast development at <a href="http://www.icecast.org">www.icecast.org</a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
</xsl:template>
|
||||
<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" />
|
||||
<!-- Import include files -->
|
||||
<xsl:include href="includes/head.xsl"/>
|
||||
<xsl:include href="includes/header.xsl"/>
|
||||
<xsl:include href="includes/footer.xsl"/>
|
||||
|
||||
<xsl:include href="includes/mountnav.xsl"/>
|
||||
|
||||
<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>Move listeners</h2>
|
||||
<div class="article">
|
||||
<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">
|
||||
<option value="{@mount}">
|
||||
<xsl:value-of select="@mount" />
|
||||
</option>
|
||||
</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>
|
||||
|
||||
<!-- Footer -->
|
||||
<xsl:call-template name="footer" />
|
||||
|
||||
</body>
|
||||
</html>
|
||||
</xsl:template>
|
||||
</xsl:stylesheet>
|
@ -1,35 +1,37 @@
|
||||
<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:template match = "/iceresponse" >
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>Icecast Streaming Media Server</title>
|
||||
<link rel="stylesheet" type="text/css" href="/style.css" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
||||
</head>
|
||||
<body>
|
||||
<h1>Icecast2 Admin</h1>
|
||||
<!--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 -->
|
||||
<h2>Icecast Server Response</h2>
|
||||
<xsl:for-each select="/iceresponse">
|
||||
<div class="roundbox">
|
||||
<h3>Response</h3>
|
||||
<p>Message: <xsl:value-of select="message" /></p>
|
||||
<p>Return Code: <xsl:value-of select="return" /></p>
|
||||
</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 xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0">
|
||||
<xsl:output method="html" doctype-system="about:legacy-compat" encoding="UTF-8" />
|
||||
<!-- Import include files -->
|
||||
<xsl:include href="includes/head.xsl"/>
|
||||
<xsl:include href="includes/header.xsl"/>
|
||||
<xsl:include href="includes/footer.xsl"/>
|
||||
|
||||
<xsl:template match="/iceresponse">
|
||||
<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>Server Response</h2>
|
||||
<xsl:for-each select="/iceresponse">
|
||||
<div class="article">
|
||||
<h3>Response</h3>
|
||||
<h4>Message</h4>
|
||||
<p><xsl:value-of select="message" /></p>
|
||||
<p>(Return Code: <xsl:value-of select="return" />)</p>
|
||||
</div>
|
||||
</xsl:for-each>
|
||||
</div>
|
||||
|
||||
<!-- Footer -->
|
||||
<xsl:call-template name="footer" />
|
||||
|
||||
</body>
|
||||
</html>
|
||||
</xsl:template>
|
||||
</xsl:stylesheet>
|
||||
|
268
admin/stats.xsl
268
admin/stats.xsl
@ -1,150 +1,144 @@
|
||||
<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:template match = "/icestats" >
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>Icecast Streaming Media Server</title>
|
||||
<link rel="stylesheet" type="text/css" href="/style.css" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
||||
</head>
|
||||
<body>
|
||||
<h1>Icecast2 Admin</h1>
|
||||
<!--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>
|
||||
<xsl:for-each select="authentication/role">
|
||||
<li>
|
||||
Role
|
||||
<xsl:if test="@name">
|
||||
<xsl:value-of select="@name" />
|
||||
</xsl:if>
|
||||
of type <xsl:value-of select="@type" />:
|
||||
<xsl:if test="@management-url">
|
||||
<a href="{@management-url}">Manage Authentication</a>
|
||||
</xsl:if>
|
||||
</li>
|
||||
</xsl:for-each>
|
||||
</ul>
|
||||
</xsl:if>
|
||||
</div>
|
||||
<!--end global server stats-->
|
||||
<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" />
|
||||
<!-- Import include files -->
|
||||
<xsl:include href="includes/head.xsl"/>
|
||||
<xsl:include href="includes/header.xsl"/>
|
||||
<xsl:include href="includes/footer.xsl"/>
|
||||
|
||||
<!--mount point stats-->
|
||||
<xsl:for-each select="source">
|
||||
<xsl:if test = "listeners!=''">
|
||||
<div class="roundbox">
|
||||
<div class="mounthead">
|
||||
<h3 class="mount">Mountpoint <xsl:value-of select="@mount" /></h3>
|
||||
<div class="right">
|
||||
<xsl:include href="includes/mountnav.xsl"/>
|
||||
|
||||
<!-- Auth template -->
|
||||
<xsl:template name="authlist">
|
||||
<ul>
|
||||
<xsl:for-each select="authentication/role">
|
||||
<li>Role
|
||||
<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="authenticator">
|
||||
<a class="auth" href="/auth.xsl">Login</a>
|
||||
<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: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><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: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>
|
||||
<xsl:for-each select="*">
|
||||
<xsl:if test="name() != 'metadata' and name() != 'authentication'">
|
||||
<tr>
|
||||
<td><xsl:value-of select="name()" /></td>
|
||||
<td><xsl:value-of select="." /></td>
|
||||
</tr>
|
||||
</xsl:if>
|
||||
</xsl:for-each>
|
||||
<xsl:if test="metadata">
|
||||
</li>
|
||||
</xsl:for-each>
|
||||
</ul>
|
||||
</xsl:template>
|
||||
|
||||
|
||||
<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>Administration</h2>
|
||||
|
||||
<!-- Global stats table -->
|
||||
<div class="article">
|
||||
<h3>Global server stats</h3>
|
||||
<table class="table-block">
|
||||
<thead>
|
||||
<tr>
|
||||
<th colspan="2">Extra metadata</th>
|
||||
<th>Key</th>
|
||||
<th>Value</th>
|
||||
</tr>
|
||||
<xsl:for-each select="metadata/*">
|
||||
</thead>
|
||||
<tbody>
|
||||
<xsl:for-each select="/icestats/*[not(self::source) and not(self::authentication)]">
|
||||
<tr>
|
||||
<td><xsl:value-of select="name()" /></td>
|
||||
<td><xsl:value-of select="." /></td>
|
||||
<td><xsl:value-of select="text()" /></td>
|
||||
</tr>
|
||||
</xsl:for-each>
|
||||
</xsl:if>
|
||||
</tbody>
|
||||
</table>
|
||||
<xsl:if test="authentication">
|
||||
<table>
|
||||
<ul>
|
||||
<xsl:for-each select="authentication/role">
|
||||
<li>
|
||||
Role
|
||||
<xsl:if test="@name">
|
||||
<xsl:value-of select="@name" />
|
||||
</xsl:if>
|
||||
of type <xsl:value-of select="@type" />:
|
||||
<xsl:if test="@management-url">
|
||||
<a href="{@management-url}">Manage Authentication</a>
|
||||
</xsl:if>
|
||||
</li>
|
||||
</xsl:for-each>
|
||||
</ul>
|
||||
</tbody>
|
||||
</table>
|
||||
</xsl:if>
|
||||
|
||||
<!-- 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">► <span>M3U</span></a>
|
||||
<xsl:text> </xsl:text>
|
||||
<a class="play" href="{@mount}.xspf">► <span>XSPF</span></a>
|
||||
<xsl:text> </xsl:text>
|
||||
<a class="play" href="{@mount}.vclt">► <span>VCLT</span></a>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
<h4>Further information</h4>
|
||||
<table class="table-block">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Key</th>
|
||||
<th>Value</th>
|
||||
</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/*">
|
||||
<tr>
|
||||
<td><xsl:value-of select="name()" /></td>
|
||||
<td><xsl:value-of select="text()" /></td>
|
||||
</tr>
|
||||
</xsl:for-each>
|
||||
</tbody>
|
||||
</table>
|
||||
</xsl:if>
|
||||
|
||||
<!-- Mount Authentication -->
|
||||
<xsl:if test="authentication">
|
||||
<h4>Mount Authentication</h4>
|
||||
<xsl:call-template name="authlist" />
|
||||
</xsl:if>
|
||||
|
||||
</div>
|
||||
</xsl:for-each>
|
||||
</div>
|
||||
</div>
|
||||
</xsl:if>
|
||||
</xsl:for-each>
|
||||
<!--end mount point stats-->
|
||||
<div id="footer">
|
||||
Support icecast development at <a href="http://www.icecast.org">www.icecast.org</a>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
</xsl:template>
|
||||
</xsl:stylesheet>
|
||||
|
||||
<!-- Footer -->
|
||||
<xsl:call-template name="footer" />
|
||||
|
||||
</body>
|
||||
</html>
|
||||
</xsl:template>
|
||||
</xsl:stylesheet>
|
@ -1,49 +1,48 @@
|
||||
<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:template match = "/icestats">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<title>Icecast Streaming Media Server</title>
|
||||
<link rel="stylesheet" type="text/css" href="/style.css" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
||||
</head>
|
||||
<body>
|
||||
<h1>Icecast2 Admin</h1>
|
||||
<!--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 -->
|
||||
<h2>Update Metadata</h2>
|
||||
<xsl:for-each select="source">
|
||||
<div class="roundbox">
|
||||
<h3>Mountpoint <xsl:value-of select="@mount" />
|
||||
<xsl:if test="server_name">
|
||||
<small><xsl:value-of select="server_name" /></small>
|
||||
</xsl:if>
|
||||
</h3>
|
||||
<form class="alignedform" method="get" action="/admin/metadata.xsl">
|
||||
<p>
|
||||
<label for="song">Metadata:</label>
|
||||
<input type="text" id="song" name="song"/>
|
||||
</p>
|
||||
<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>
|
||||
</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:output method="html" doctype-system="about:legacy-compat" encoding="UTF-8" indent="yes" />
|
||||
<!-- Import include files -->
|
||||
<xsl:include href="includes/head.xsl"/>
|
||||
<xsl:include href="includes/header.xsl"/>
|
||||
<xsl:include href="includes/footer.xsl"/>
|
||||
|
||||
<xsl:include href="includes/mountnav.xsl"/>
|
||||
|
||||
<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>Update Metadata</h2>
|
||||
|
||||
<xsl:for-each select="source">
|
||||
<div class="article">
|
||||
<h3>Mountpoint <xsl:value-of select="@mount" /></h3>
|
||||
<!-- Mount nav -->
|
||||
<xsl:call-template name="mountnav" />
|
||||
<form method="get" action="/admin/metadata.xsl">
|
||||
<label for="metadata" class="hidden">Metadata</label>
|
||||
<input type="text" id="metadata" name="song" value="" placeholder="Click to edit" required="required" />
|
||||
<input type="hidden" name="mount" value="{@mount}" />
|
||||
<input type="hidden" name="mode" value="updinfo" />
|
||||
<input type="hidden" name="charset" value="UTF-8" />
|
||||
<input type="submit" value="Update Metadata" />
|
||||
</form>
|
||||
</div>
|
||||
</xsl:for-each>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- Footer -->
|
||||
<xsl:call-template name="footer" />
|
||||
|
||||
</body>
|
||||
</html>
|
||||
</xsl:template>
|
||||
</xsl:stylesheet>
|
@ -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/net/Makefile src/common/timing/Makefile doc/Makefile doc/img/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])
|
||||
|
@ -2,6 +2,8 @@
|
||||
|
||||
AUTOMAKE_OPTIONS = foreign
|
||||
|
||||
SUBDIRS = assets
|
||||
|
||||
webdir = $(pkgdatadir)/web
|
||||
dist_web_DATA = status.xsl \
|
||||
favicon.ico \
|
||||
|
5
web/assets/Makefile.am
Normal file
5
web/assets/Makefile.am
Normal file
@ -0,0 +1,5 @@
|
||||
## Process this file with automake to produce Makefile.in
|
||||
|
||||
AUTOMAKE_OPTIONS = foreign
|
||||
|
||||
SUBDIRS = css font
|
9
web/assets/css/Makefile.am
Normal file
9
web/assets/css/Makefile.am
Normal 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
981
web/assets/css/style.css
Normal 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%;}
|
BIN
web/assets/font/FiraMono-Bold.eot
Normal file
BIN
web/assets/font/FiraMono-Bold.eot
Normal file
Binary file not shown.
BIN
web/assets/font/FiraMono-Bold.woff
Normal file
BIN
web/assets/font/FiraMono-Bold.woff
Normal file
Binary file not shown.
BIN
web/assets/font/FiraMono-Regular.eot
Normal file
BIN
web/assets/font/FiraMono-Regular.eot
Normal file
Binary file not shown.
BIN
web/assets/font/FiraMono-Regular.woff
Normal file
BIN
web/assets/font/FiraMono-Regular.woff
Normal file
Binary file not shown.
BIN
web/assets/font/FiraSans-Bold.eot
Normal file
BIN
web/assets/font/FiraSans-Bold.eot
Normal file
Binary file not shown.
BIN
web/assets/font/FiraSans-Bold.woff
Normal file
BIN
web/assets/font/FiraSans-Bold.woff
Normal file
Binary file not shown.
BIN
web/assets/font/FiraSans-BoldItalic.eot
Normal file
BIN
web/assets/font/FiraSans-BoldItalic.eot
Normal file
Binary file not shown.
BIN
web/assets/font/FiraSans-BoldItalic.woff
Normal file
BIN
web/assets/font/FiraSans-BoldItalic.woff
Normal file
Binary file not shown.
BIN
web/assets/font/FiraSans-Italic.eot
Normal file
BIN
web/assets/font/FiraSans-Italic.eot
Normal file
Binary file not shown.
BIN
web/assets/font/FiraSans-Italic.woff
Normal file
BIN
web/assets/font/FiraSans-Italic.woff
Normal file
Binary file not shown.
BIN
web/assets/font/FiraSans-Regular.eot
Normal file
BIN
web/assets/font/FiraSans-Regular.eot
Normal file
Binary file not shown.
BIN
web/assets/font/FiraSans-Regular.woff
Normal file
BIN
web/assets/font/FiraSans-Regular.woff
Normal file
Binary file not shown.
14
web/assets/font/Makefile.am
Normal file
14
web/assets/font/Makefile.am
Normal 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)
|
Loading…
Reference in New Issue
Block a user