Merge branch 'master' into pierreozoux-patch-1

This commit is contained in:
Julius Härtl 2017-11-13 09:06:48 +01:00 committed by GitHub
commit 58ae46d2b9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
349 changed files with 22897 additions and 2167 deletions

View File

@ -1,5 +1,5 @@
pipeline:
documentation:
image: nextcloudci/documentation:1.0.11
image: nextcloudci/documentation:documentation-4
commands:
- make all

3
.gitignore vendored
View File

@ -3,6 +3,7 @@
# Generated Files
*/_build/*
conf.pyc
# Meta Data
.DS_Store
@ -15,4 +16,4 @@
# Exclude NetBeans project
/nbproject/*
*.db
*.snag
*.snag

View File

@ -144,10 +144,16 @@
<div class="content row">
<main class="main">
<div class="row page-content-header">
<div class="col-md-6">
<div class="col-md-8">
<h1><a href="{{ pathto(master_doc) }}">{{ project|e }}</a></h1>
<div class="doc-version-switch">
Versions:
{%- for v in doc_versions %}
<a href="https://docs.nextcloud.com/server/{{ v }}/{{current_doc}}/{{pagename}}.html" {% if version == v %} class="current-doc"{% endif %}>{{v}}</a>
{%- endfor %}
</div>
</div>
<div class="col-md-5 col-md-offset-1">
<div class="col-md-4">
{% if theme_show_search %}
<form class="headersearch" style="margin: 16px 0;" action="{{ pathto('search') }}" method="get">
<input type="text" value="" name="q" id="q" class="form-control" />

View File

@ -6,7 +6,7 @@
<li class="prev">
<a href="{{ prev.link|e }}" title="{{ _('Previous Chapter: ') + prev.title|striptags }}">
{%- if theme_bootstrap_version == "3" -%}<span class="glyphicon glyphicon-chevron-left visible-sm"></span>{%- endif -%}
<span class="hidden-sm">{{ "&laquo;"|safe }} {{ prev.title|striptags|truncate(length=16, killwords=True) }}</span>
<span class="hidden-sm">{{ "&laquo;"|safe }} {{ prev.title|striptags }}</span>
</a>
</li>
{%- endif %}
@ -14,7 +14,7 @@
<li class="next">
<a href="{{ next.link|e }}" title="{{ _('Next Chapter: ') + next.title|striptags }}">
{%- if theme_bootstrap_version == "3" -%}<span class="glyphicon glyphicon-chevron-right visible-sm"></span>{%- endif -%}
<span class="hidden-sm">{{ next.title|striptags|truncate(length=16, killwords=True) }} {{ "&raquo;"|safe }}</span>
<span class="hidden-sm">{{ next.title|striptags }} {{ "&raquo;"|safe }}</span>
</a>
</li>
{%- endif %}

View File

@ -3,8 +3,8 @@
/* enable to reveal boxes everywhere */
/** {
border-style: solid;
border-color: red;
border-style: solid;
border-color: red;
}*/
@font-face {
@ -55,6 +55,7 @@ body {
h1, h2, h3 {
font-weight: 300;
margin-top: 40px !important;
}
h1 {
font-size: 45px;
@ -77,13 +78,13 @@ img {
}
.btn-default {
/* background: rgba(240,240,240,.9); */
/* border: 1px solid rgba(210,210,210,.9); */
/* background: rgba(240,240,240,.9); */
/* border: 1px solid rgba(210,210,210,.9); */
}
.btn-default:hover, .btn-default:focus, .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default {
/* background: white; */
/* border: 1px solid rgba(240,240,240,.9); */
/* background: white; */
/* border: 1px solid rgba(240,240,240,.9); */
}
.btn-primary {
@ -93,9 +94,9 @@ img {
}
.btn-primary:hover, .btn-primary:focus, .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary {
/* background: #428BCA; */
/* border: 1px solid #1D2D44; */
/* color: white; */
/* background: #428BCA; */
/* border: 1px solid #1D2D44; */
/* color: white; */
}
/* button a {color: #1d2d44} */
@ -974,7 +975,7 @@ img.desaturate {
background-size: cover;
-o-background-size: cover;
/* border: 0px; */
/* min-height: 450px; background-position: 35% 40%; */
/* min-height: 450px; background-position: 35% 40%; */
position: relative;
margin-left: 0px !important;
margin-right: 0px !important;
@ -982,7 +983,7 @@ img.desaturate {
}
/*.ft-img-center {
margin: 0 auto;
margin: 0 auto;
}*/
.ft-sharing {
@ -1019,7 +1020,7 @@ img.desaturate {
@media (max-width: 767px) {
.ft-everywhere-img {
/* height: auto; */
/* height: auto; */
width: 20%;
right: 5%;
}
@ -1045,12 +1046,12 @@ img.desaturate {
}
/*.ft-img-overlay a {
display: table;
display: table;
}*/
/*.ft-img-overlay img {
width: 100%;
height: 100%;
width: 100%;
height: 100%;
}*/
.ft-play-overlay {
@ -1059,9 +1060,9 @@ img.desaturate {
top: 30%;
left: 45%;
margin-top: 10px;
/* width: 0px; */
/* height: 0px; */
/* padding: 50%; */
/* width: 0px; */
/* height: 0px; */
/* padding: 50%; */
}
.youtube i {
@ -1128,11 +1129,6 @@ a.headerlink {
#menu-support.menu ul ul ul {
list-style-type: square;
}
/* having a separator between each elements of the top list and
between above the top of the third level list */
#menu-support.menu ul ul ul {
border-top: 1px solid #EFEFEF;
}
.terminal-image {
box-shadow: 1px 1px 15px rgba(0, 0, 0, 0.3);
@ -1142,3 +1138,75 @@ a.headerlink {
li.next {
float: right;
}
/* Floating image on code */
.figure.figure-with-code img {
margin: 0;
}
.figure.figure-with-code {
float: right;
max-width: 40%;
min-width: 200px;
}
.figure.figure-with-code + .code.html,
.figure.figure-with-code + .highlight-html {
max-width: 59%;
}
.figure.figure-with-code + .code.html::after,
.figure.figure-with-code + .highlight-html::after {
content: ' ';
clear: both;
display: block;
}
/* Fix nested lists bold */
li > dl > dt {
font-weight: inherit;
}
/* Icons grid */
#icons > blockquote > div {
display: inline-flex;
flex-wrap: wrap;
justify-content: space-between;
}
#icons > blockquote > div > div {
margin: 20px;
text-align: center;
flex: 10%;
}
#icons > blockquote > div img {
margin: 5px;
}
#icons > blockquote > div p {
font-size: inherit;
}
#icons > blockquote > div a {
display: flex;
width: 42px;
height: 42px;
margin: auto;
}
#icons > blockquote > div > div a[href*='white'],
#icons > blockquote > div > div a[href*='/calendar.'],
#icons > blockquote > div > div a[href*='/caret.'],
#icons > blockquote > div > div a[href*='/contacts.'],
#icons > blockquote > div > div a[href*='/files1.'],
#icons > blockquote > div > div a[href*='/music.'],
#icons > blockquote > div > div a[href*='/picture.'],
#icons > blockquote > div > div a[href*='white'] {
background: #ddd;
border-radius: 50%;
}
/* Version switcher */
.doc-version-switch a {
padding: 3px;
margin-left:10px;
display: inline-block;
}
.doc-version-switch .current-doc {
font-weight: 900;
}

View File

@ -100,25 +100,23 @@
<div class="wrap container not-front">
<div class="content row">
<main class="main">
<div class="row page-content-header">
<div class="col-md-5 col-md-offset-7">
{% if theme_show_search %}
<form class="headersearch" style="margin-bottom:-3px;" action="{{ pathto('search') }}" method="get">
<input type="text" value="" name="q" id="q" class="form-control" />
<button class="btn btn-default" type="submit" id="searchsubmit">Search</button>
</form>
{% endif %}
</div>
</div>
{% block sidebartoc %}
<div class="row">
<div class="col-md-3">
<div class="sidebar">
<h1>{{ project|e }}</h1>
{% if theme_show_search %}
<div class="sidebar-search">
<form class="headersearch" action="{{ pathto('search') }}" method="get">
<input type="text" value="" name="q" id="q" class="form-control" />
<button class="btn btn-default" type="submit" id="searchsubmit">Search</button>
</form>
</div>
{% endif %}
<div class="menu-support-container">
<ul id="menu-support" class="menu">
<ul>
<li><a href="{{ pathto(master_doc) }}">Table of Contents</a></li>
<li><a href="{{ pathto(master_doc) }}">Table of Contents</a></li>
</ul>
{{ toctree(maxdepth=3) }}
</ul>

View File

@ -6,7 +6,7 @@
<li class="prev">
<a href="{{ prev.link|e }}" title="{{ _('Previous Chapter: ') + prev.title|striptags }}">
{%- if theme_bootstrap_version == "3" -%}<span class="glyphicon glyphicon-chevron-left visible-sm"></span>{%- endif -%}
<span class="hidden-sm">{{ "&laquo;"|safe }} {{ prev.title|striptags|truncate(length=16, killwords=True) }}</span>
<span class="hidden-sm">{{ "&laquo;"|safe }} {{ prev.title|striptags }}</span>
</a>
</li>
{%- endif %}
@ -14,7 +14,7 @@
<li class="next">
<a href="{{ next.link|e }}" title="{{ _('Next Chapter: ') + next.title|striptags }}">
{%- if theme_bootstrap_version == "3" -%}<span class="glyphicon glyphicon-chevron-right visible-sm"></span>{%- endif -%}
<span class="hidden-sm">{{ next.title|striptags|truncate(length=16, killwords=True) }} {{ "&raquo;"|safe }}</span>
<span class="hidden-sm">{{ next.title|striptags }} {{ "&raquo;"|safe }}</span>
</a>
</li>
{%- endif %}

File diff suppressed because it is too large Load Diff

View File

@ -290,6 +290,25 @@ div.thumbnail > img {
/* -- Start specific css for documentation -- */
.sidebar h1 {
font-size: 1.5em;
margin: 0;
padding: 10px;
border-bottom: 1px solid #ccc;
}
.sidebar-search form {
display: flex;
width: 100%;
}
.sidebar-search input,
.sidebar-search button {
margin: 10px;
}
.sidebar-search input {
flex-grow: 1;
margin-right: 0;
}
ul#menu-support.menu {
padding-left: 0;
}
@ -308,12 +327,6 @@ ul#menu-support.menu ul ul {
ul#menu-support.menu ul ul ul {
list-style-type: square;
}
/* having a separator between each elements of the top list and
between above the top of the third level list */
ul#menu-support.menu > ul > li,
ul#menu-support.menu ul ul ul {
border-top: 1px solid #EFEFEF;
}
/* set to default padding for the sublist of the current entry */
ul#menu-support.menu ul > li.current > ul {
padding-left: 20px;
@ -347,25 +360,14 @@ ul#menu-support.menu > ul li.toctree-l1.current {
padding-right: 0;
}
#menu-support > ul > li:nth-child(odd) {
#menu-support > ul > li {
border-top: 1px solid #ccc;
}
#menu-support > ul:last-child {
border-bottom: 1px solid #ccc;
}
#menu-support > ul > li:last-child {
border-bottom: 0;
}
#menu-support > ul > .current {
border: 1px solid #999 !important;
border-right: 0 !important;
border-bottom-left-radius: 5px;
border-top-left-radius: 5px;
}
#menu-support > ul > .current + li{
border-top: 0;
}
#menu-support ul ul {
padding-left: 27px;
}
@ -483,3 +485,14 @@ li.next {
li.next {
float: right;
}
.not-front .content.row,
.content > .main > .row {
margin-top: 0;
}
.page-content {
margin-top: 10px;
}
.content > .main > .row .sidebar {
border-right: 1px solid #ccc;
}

View File

@ -13,6 +13,10 @@
import sys, os
# import global configuration from parent directory
sys.path.insert(0, os.path.abspath('../'))
from conf import *
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
@ -44,13 +48,13 @@ master_doc = 'contents'
# built documents.
#
# The short X.Y version.
version = '12'
#version = '12'
# The full version, including alpha/beta/rc tags.
release = '12'
#release = '12'
# General information about the project.
project = u'Nextcloud %s Server Administration Manual' % (version)
copyright = u'2012-2017, The Nextcloud developers'
project = u'Nextcloud %s Administration Manual' % (version)
#copyright = u'2012-2017, The Nextcloud developers'
# The language for content autogenerated by Sphinx. Refer to documentation

View File

@ -0,0 +1,24 @@
==========================
BigInt (64bit) identifiers
==========================
Since Nextcloud 13 big integers are used to store identifiers and auto-increment keys in the database.
Because changing columns on huge tables can take quite a while (up to hours or days), the update from
Nextcloud 12 or earlier did not perform this migration on the filecache and activity table.
To make it easy to force the update on that tables too, we added a console command, which can be used
to migrate the remaining columns to bigints.
The command can safely be executed. It will show a success message when there is nothing to do::
sudo -u www-data ./occ db:convert-filecache-bigint
All tables already up to date!
or otherwise ask for confirmation, before performing the heavy actions::
sudo -u www-data ./occ db:convert-filecache-bigint
This can take up to hours, depending on the number of files in your instance!
Continue with the conversion (y/n)? [n]
.. note:: Similar to a normal update, you should shutdown your apache or nginx server or enable maintenance
mode before running the command to avoid issues with your sync clients.

View File

@ -5,6 +5,7 @@ Database Configuration
.. toctree::
:maxdepth: 2
db_conversion.rst
linux_database_configuration.rst
db_conversion
linux_database_configuration
mysql_4byte_support
bigint_identifiers

View File

@ -242,18 +242,20 @@ View current location of keys::
occ encryption:show-key-storage-root
Current key storage root: default storage location (data/)
Move keys to a different root folder, either locally or on a different server.
Move keys to a different folder, either locally or on a different server.
The folder must already exist, be owned by root and your HTTP group, and be
restricted to root and your HTTP group. This example is for Ubuntu Linux. Note
that the new folder is relative to your ``occ`` directory::
restricted to root and your HTTP group. Further the folder needs to be located
somewhere in your Nextcloud data folder, either physically, or as a mount.
This example is for Ubuntu Linux. Note that the new folder is relative to your ``occ`` directory::
mkdir /etc/keys
chown -R root:www-data /etc/keys
chmod -R 0770 /etc/keys
occ encryption:change-key-storage-root ../../../etc/keys
cd /your/nextcloud/data
mkdir keys
chown -R root:www-data keys
chmod -R 0770 keys
occ encryption:change-key-storage-root keys
Start to move keys:
4 [============================]
Key storage root successfully changed to ../../../etc/keys
Key storage root successfully changed to keys
Create a new master key. Use this when you have a single-sign on
infrastructure. Use this only on fresh installations with no existing data, or

View File

@ -6,7 +6,7 @@ Nextcloud storage backends accept one or more authentication schemes such as
passwords, OAuth, or token-based, to name a few examples. Each authentication
scheme may be implemented by multiple authentication mechanisms. Different
mechanisms require different configuration parameters, depending on their
behaviour.
behavior.
.. figure:: images/authentication-types.png

View File

@ -68,7 +68,3 @@ because it is not designed to store locks, and data can disappear from the cache
at any time. Redis is a key-value store, and it guarantees that cached objects
are available for as long as they are needed.
Debian Jesse users, please see this `Github discussion
<https://github.com/owncloud/core/issues/20675>`_ if you have problems with
LDAP authentication.

View File

@ -999,7 +999,7 @@ Defaults to ``2``
'preview_max_filesize_image' => 50,
max file size for generating image previews with imagegd (default behaviour)
max file size for generating image previews with imagegd (default behavior)
If the image is bigger, it'll try other preview generators, but will most
likely show the default mimetype icon. Set to -1 for no limit.

View File

@ -106,7 +106,7 @@ or Federated Cloud Sharing will not work reliably."
system or features such as installing and updating apps via the app store or Federated
Cloud Sharing will not work reliably."
There are known bugs in older OpenSSL and NSS versions leading to misbehaviour in
There are known bugs in older OpenSSL and NSS versions leading to misbehavior in
combination with remote hosts using SNI. A technology used by most of the HTTPS
websites. To ensure that Nextcloud will work properly you need to update OpenSSL
to at least 1.0.2b or 1.0.1d. For NSS the patch version depends on your distribution

View File

@ -475,7 +475,7 @@ Internal Username:
services.
You can override all of this with the Internal Username setting. Leave it
empty for default behaviour. Changes will affect only newly mapped LDAP users.
empty for default behavior. Changes will affect only newly mapped LDAP users.
* Example: *uid*
@ -486,7 +486,7 @@ Override UUID detection
You can override the setting and pass an attribute of your choice. You must
make sure that the attribute of your choice can be fetched for both users and
groups and it is unique. Leave it empty for default behaviour. Changes will
groups and it is unique. Leave it empty for default behavior. Changes will
have effect only on newly mapped LDAP users and groups. It also will
have effect when a user's or group's DN changes and an old UUID was cached,
which will result in a new user. Because of this, the setting should be

View File

@ -312,7 +312,7 @@ XML Output
<data/>
</ocs>
Get user´s groups
Get user's groups
-----------------
Retrieves a list of groups the specified user is a member of. Authentication is
@ -516,7 +516,7 @@ XML Output
<data/>
</ocs>
Get user´s subadmin groups
Get user's subadmin groups
--------------------------
Returns the groups in which the user is a subadmin. Authentication is done by

View File

@ -30,4 +30,4 @@ Currently retention is based on the creation date of the file. The sync client s
the **original** creation date to the server, while uploading through the web interface
will create a new file with a **new** creation date.
We hope to be able to add a ``upload date`` to the filesystem soon, which would make more
sense. Until then this potentially unexpected behaviour has to be taken into account.
sense. Until then this potentially unexpected behavior has to be taken into account.

View File

@ -506,7 +506,7 @@ master-slave setup.
What about the other DBMS?
* Sqlite is adequate for simple testing, and for low-load single-user
* SQLite is adequate for simple testing, and for low-load single-user
deployments. It is not adequate for production systems.
* Microsoft SQL Server is not a supported option.
* For Oracle DB support please `contact the Nextcloud team`_ to get more

View File

@ -149,8 +149,7 @@ webroot of your nginx installation. In this example it is
# have those duplicated to the ones above)
# Before enabling Strict-Transport-Security headers please read into
# this topic first.
# add_header Strict-Transport-Security "max-age=15768000;
# includeSubDomains; preload;";
# add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
#
# WARNING: Only add the preload option once you read about
# the consequences in https://hstspreload.org/. This option
@ -205,8 +204,7 @@ your nginx installation.
# Add headers to serve security related headers
# Before enabling Strict-Transport-Security headers please read into this
# topic first.
#add_header Strict-Transport-Security "max-age=15768000;
# includeSubDomains; preload;";
#add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;";
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;

View File

@ -107,7 +107,7 @@ Debugging Sync Issues
.. warning:: The data directory on the server is exclusive to Nextcloud and must
not be modified manually.
Disregarding this can lead to unwanted behaviours like:
Disregarding this can lead to unwanted behaviors like:
* Problems with sync clients
* Undetected changes due to caching in the database

View File

@ -12,19 +12,27 @@ So it is quite easy, to migrate from one ownCloud version to at least one Nextcl
However this does only work with versions that are close enough database and code-wise.
See the table below for a version map, where migrating is easily possible:
+-----------------+-----------------+
| ownCloud | Nextcloud |
+=================+=================+
| 10.0.1 or later | 12.0.1 or later |
+-----------------+-----------------+
| 10.0.0 | 12.0.0 |
+-----------------+-----------------+
| 9.1.x | 10.0.x |
+-----------------+-----------------+
| 9.0.x | 10.0.x |
+-----------------+-----------------+
| 9.0.x | 9.0.x |
+-----------------+-----------------+
+-------------------+-----------------+
| ownCloud | Nextcloud |
+===================+=================+
| 10.0.2 or earlier | 12.0.1 or later |
+-------------------+-----------------+
| 10.0.0 | 12.0.0 |
+-------------------+-----------------+
| 9.1.x | 10.0.x |
+-------------------+-----------------+
| 9.0.x | 10.0.x |
+-------------------+-----------------+
| 9.0.x | 9.0.x |
+-------------------+-----------------+
.. note:: While we understand, that you want to migrate as soon as possible,
we also don't want to put your data at risk. Since we never know
what ownCloud changes in a future release, we only allow migrations
from versions that where released before our last maintenance release,
so we can at least perform some basic migration tests, before you
migrate your production instance.
After downloading the correct version of Nextcloud from our
`older releases page <https://nextcloud.com/changelog/>`_,

View File

@ -1,8 +1,8 @@
============================
Upgrade via build-in Updater
Upgrade via built-in updater
============================
The build-in updater automates many of the steps of upgrading an Nextcloud
The built-in updater automates many of the steps of upgrading an Nextcloud
installation. It is useful for installations that do not have root access,
such as shared hosting, for installations with a smaller number of users
and data, and it automates updating
@ -16,10 +16,10 @@ and data, and it automates updating
issue can be resolved without downgrading.
You should maintain regular backups (see :doc:`backup`), and make a backup
before every update. The build-in updater does not backup your database or data
before every update. The built-in updater does not backup your database or data
directory.
What does the Updater do?
What does the updater do?
-------------------------
.. note::
@ -28,7 +28,7 @@ What does the Updater do?
The command line mode provides a way to do this right after the code was
successfully replaced.
The build-in updater performs these operations:
The built-in updater performs these operations:
* **Check for expected files:** checks if only the expected files of a
Nextcloud installation are present, because it turned out that some files
@ -66,10 +66,10 @@ The build-in updater performs these operations:
linked page or to the command line to finish the upgrade by executing the
migration steps.
Using the web based Updater
Using the web based updater
---------------------------
Using the build-in Updater to update your Nextcloud installation is just a few
Using the built-in updater to update your Nextcloud installation is just a few
steps:
1. You should see a notification at the top of any Nextcloud page when there is
@ -154,7 +154,7 @@ This is how the command line based update would continue:
Maintenance mode is kept active
Reset log level
Using the command line based Updater
Using the command line based updater
------------------------------------
The command line based updater works in the exact same way the web based

24
conf.py Normal file
View File

@ -0,0 +1,24 @@
# global configuration for every documentation added at the end
import os
# General information about the project.
copyright = u'2012-2017, The Nextcloud developers'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = '13'
# The full version, including alpha/beta/rc tags.
release = '13'
# substitutions go here
rst_epilog = '.. |version| replace:: %s' % version
html_context = {
'doc_versions': ['11', '12', '13'],
'current_doc': os.path.basename(os.getcwd()),
}

View File

@ -11,6 +11,8 @@ If you are unfamiliar with this pattern, watch the following videos:
* `Dependency Injection and the art of Services and Containers Tutorial <http://www.youtube.com/watch?v=DcNtg4_i-2w>`_
* `Google Clean Code Talks <http://www.youtube.com/watch?v=RlfLCWKxHJ0>`_
.. _dependency-injection:
Dependency Injection
====================
Dependency Injection sounds pretty complicated but it just means: Don't put new dependencies in your constructor or methods but pass them in. So this:

View File

@ -25,467 +25,9 @@ Web Components go into the **component/** folder and can be imported like this:
<?php
// include one file
component('myapp', 'tabs'); // adds component/tabs.html
// include multiple files for the same app
component('myapp', array('tabs', 'forms')); // adds component/tabs.html, component/forms.html
.. note:: Keep in mind that Web Components are still very new and you `might need to add polyfills <https://www.webcomponents.org/polyfills/>`_
Standard layout
===============
To use the commonly used layout consisting of sidebar navigation and content the **app-navigation** and **app-content** ids can be used:
.. code-block:: html
<div id="app">
<div id="app-navigation">Your navigation</div>
<div id="app-content">
<div id="app-content-wrapper">
Your content in here
</div>
</div>
</div>
For built in mobile support your content has to be wrapped inside another div with the id **app-content-wrapper**.
Navigation
==========
Nextcloud provides a default CSS navigation layout. If list entries should have 16x16 px icons, the **with-icon** class can be added to the base **ul**. The maximum supported indention level is two, further indentions are not recommended.
.. code-block:: html
<div id="app-navigation">
<ul class="with-icon">
<li><a href="#">First level entry</a></li>
<li>
<a href="#">First level container</a>
<ul>
<li><a href="#">Second level entry</a></li>
<li><a href="#">Second level entry</a></li>
</ul>
</li>
</ul>
</div>
Folders
-------
Folders are like normal entries and are only supported for the first level. In contrast to normal entries, the links which show the title of the folder need to have the **icon-folder** CSS class.
If the folder should be collapsible, the **collapsible** class and a button with the class **collapse** are needed. After adding the collapsible class the folder's child entries can be toggled by adding the **open** class to the list element:
.. code-block:: html
<div id="app-navigation">
<ul class="with-icon">
<li><a href="#">First level entry</a></li>
<li class="collapsible open">
<button class="collapse"></button>
<a href="#" class="icon-folder svg">Folder name</a>
<ul>
<li><a href="#">Folder contents</a></li>
<li><a href="#">Folder contents</a></li>
</ul>
</li>
</ul>
</div>
Drag and drop
-------------
The class which should be applied to a first level element (**li**) that hosts or can host a second level is **drag-and-drop**. This will cause the hovered entry to slide down giving a visual hint that it can accept the dragged element. In case of jQuery UI's droppable feature, the **hoverClass** option should be set to the **drag-and-drop** class.
.. code-block:: html
<div id="app-navigation">
<ul class="with-icon">
<li><a href="#">First level entry</a></li>
<li class="drag-and-drop">
<a href="#" class="icon-folder svg">Folder name</a>
<ul>
<li><a href="#">Folder contents</a></li>
<li><a href="#">Folder contents</a></li>
</ul>
</li>
</ul>
</div>
Menus
-----
.. versionadded:: 8
To add actions that affect the current list element you can add a menu for second and/or first level elements by adding the button and menu inside the corresponding **li** element and adding the **with-menu** CSS class:
.. code-block:: html
<div id="app-navigation">
<ul>
<li class="with-counter with-menu">
<a href="#">First level entry</a>
<div class="app-navigation-entry-utils">
<ul>
<li class="app-navigation-entry-utils-counter">15</li>
<li class="app-navigation-entry-utils-menu-button svg"><button></button></li>
</ul>
</div>
<div class="app-navigation-entry-menu">
<ul>
<li>
<a href="#" class="menuitem action action-edit permanent">
<span class="icon icon-rename"></span>
<span><?php p($l->t('Edit group'));?></span>
</a>
</li>
<li>
<a href="#" class="menuitem action action-delete permanent">
<span class="icon icon-delete"></span>
<span><?php p($l->t('Delete group'));?></span>
</a>
</li>
</ul>
</div>
</li>
</ul>
</div>
The div with the class **app-navigation-entry-utils** contains only the button (class: **app-navigation-entry-utils-menu-button**) to display the menu but in many cases another entry is needed to display some sort of count (mails count, unread feed count, etc.). In that case add the **with-counter** class to the list entry to adjust the correct padding and text-overflow of the entry's title.
The count should be limitted to 999 and turn to 999+ if any higher number is given. If AngularJS is used the following filter can be used to get the correct behaviour:
.. code-block:: js
app.filter('counterFormatter', function () {
'use strict';
return function (count) {
if (count > 999) {
return '999+';
}
return count;
};
});
Use it like this:
.. code-block:: html
<li class="app-navigation-entry-utils-counter">{{ count | counterFormatter }}</li>
The menu is hidden by default (**display: none**) and has to be triggered by adding the **open** class to the **app-navigation-entry-menu** div.
In case of AngularJS the following small directive can be added to handle all the display and click logic out of the box:
.. code-block:: js
app.run(function ($document, $rootScope) {
'use strict';
$document.click(function (event) {
$rootScope.$broadcast('documentClicked', event);
});
});
app.directive('appNavigationEntryUtils', function () {
'use strict';
return {
restrict: 'C',
link: function (scope, elm) {
var menu = elm.siblings('.app-navigation-entry-menu');
var button = $(elm)
.find('.app-navigation-entry-utils-menu-button button');
button.click(function () {
menu.toggleClass('open');
});
scope.$on('documentClicked', function (scope, event) {
if (event.target !== button[0]) {
menu.removeClass('open');
}
});
}
};
});
Editing
-------
.. versionadded:: 8
Often an edit option is needed for an entry. To add one for a given entry simply hide the title and add the following div inside the entry:
.. code-block:: html
<div id="app-navigation">
<ul class="with-icon">
<li>
<a href="#" class="hidden">First level entry</a>
<div class="app-navigation-entry-edit">
<form>
<input type="text" value="First level entry" autofocus-on-insert>
<input type="submit" value="" class="action icon-checkmark svg">
</form>
</div>
</li>
</ul>
</div>
If AngularJS is used you want to autofocus the input box. This can be achieved by placing the show condition inside an **ng-if** on the **app-navigation-entry-edit** div and adding the following directive:
.. code-block:: js
app.directive('autofocusOnInsert', function () {
'use strict';
return function (scope, elm) {
elm.focus();
};
});
**ng-if** is required because it removes/inserts the element into the DOM dynamically instead of just adding a **display: none** to it like **ng-show** and **ng-hide**.
Undo entry
----------
.. versionadded:: 8
If you want to undo a performed action on a navigation entry such as deletion, you should show the undo directly in place of the entry and make it disappear after location change or 7 seconds:
.. code-block:: html
<div id="app-navigation">
<ul class="with-icon">
<li>
<a href="#" class="hidden">First level entry</a>
<div class="app-navigation-entry-deleted">
<div class="app-navigation-entry-deleted-description">Deleted X</div>
<button class="app-navigation-entry-deleted-button icon-history svg" title="Undo"></button>
</div>
</li>
</ul>
</div>
Settings Area
=============
To create a settings area create a div with the id **app-settings** inside the **app-navigation** div:
.. code-block:: html
<div id="app">
<div id="app-navigation">
<!-- Your navigation here -->
<div id="app-settings">
<div id="app-settings-header">
<button class="settings-button"
data-apps-slide-toggle="#app-settings-content"
><?php p($l->t('Settings'));?></button>
</div>
<div id="app-settings-content">
<!-- Your settings in here -->
</div>
</div>
</div>
</div>
The data attribute **data-apps-slide-toggle** slides up a target area using a jQuery selector and hides the area if the user clicks outside of it.
Icons
=====
To use icons which are shipped in core, special classes to apply the background image are supplied. All of these classes use **background-position: center** and **background-repeat: no-repeat**.
* **icon-breadcrumb**:
.. image:: ../img/7/breadcrumb.png
* **icon-loading**:
.. image:: ../img/7/loading.png
* **icon-loading-dark**:
.. image:: ../img/7/loading-dark.png
* **icon-loading-small**:
.. image:: ../img/7/loading-small.png
* **icon-add**:
.. image:: ../img/7/actions/add.png
* **icon-caret**:
.. image:: ../img/7/actions/caret.png
* **icon-caret-dark**:
.. image:: ../img/7/actions/caret-dark.png
* **icon-checkmark**:
.. image:: ../img/7/actions/checkmark.png
* **icon-checkmark-white**:
.. image:: ../img/7/actions/checkmark-white.png
* **icon-clock**:
.. image:: ../img/7/actions/clock.png
* **icon-close**:
.. image:: ../img/7/actions/close.png
* **icon-confirm**:
.. image:: ../img/7/actions/confirm.png
* **icon-delete**:
.. image:: ../img/7/actions/delete.png
* **icon-download**:
.. image:: ../img/7/actions/download.png
* **icon-history**:
.. image:: ../img/7/actions/history.png
* **icon-info**:
.. image:: ../img/7/actions/info.png
* **icon-lock**:
.. image:: ../img/7/actions/lock.png
* **icon-logout**:
.. image:: ../img/7/actions/logout.png
* **icon-mail**:
.. image:: ../img/7/actions/mail.png
* **icon-more**:
.. image:: ../img/7/actions/more.png
* **icon-password**:
.. image:: ../img/7/actions/password.png
* **icon-pause**:
.. image:: ../img/7/actions/pause.png
* **icon-pause-big**:
.. image:: ../img/7/actions/pause-big.png
* **icon-play**:
.. image:: ../img/7/actions/play.png
* **icon-play-add**:
.. image:: ../img/7/actions/play-add.png
* **icon-play-big**:
.. image:: ../img/7/actions/play-big.png
* **icon-play-next**:
.. image:: ../img/7/actions/play-next.png
* **icon-play-previous**:
.. image:: ../img/7/actions/play-previous.png
* **icon-public**:
.. image:: ../img/7/actions/public.png
* **icon-rename**:
.. image:: ../img/7/actions/rename.png
* **icon-search**:
.. image:: ../img/7/actions/search.png
* **icon-settings**:
.. image:: ../img/7/actions/settings.png
* **icon-share**:
.. image:: ../img/7/actions/share.png
* **icon-shared**:
.. image:: ../img/7/actions/shared.png
* **icon-sound**:
.. image:: ../img/7/actions/sound.png
* **icon-sound-off**:
.. image:: ../img/7/actions/sound-off.png
* **icon-star**:
.. image:: ../img/7/actions/star.png
* **icon-starred**:
.. image:: ../img/7/actions/starred.png
* **icon-toggle**:
.. image:: ../img/7/actions/toggle.png
* **icon-triangle-e**:
.. image:: ../img/7/actions/triangle-e.png
* **icon-triangle-n**:
.. image:: ../img/7/actions/triangle-n.png
* **icon-triangle-s**:
.. image:: ../img/7/actions/triangle-s.png
* **icon-upload**:
.. image:: ../img/7/actions/upload.png
* **icon-upload-white**:
.. image:: ../img/7/actions/upload-white.png
* **icon-user**:
.. image:: ../img/7/actions/user.png
* **icon-view-close**:
.. image:: ../img/7/actions/view-close.png
* **icon-view-next**:
.. image:: ../img/7/actions/view-next.png
* **icon-view-pause**:
.. image:: ../img/7/actions/view-pause.png
* **icon-view-play**:
.. image:: ../img/7/actions/view-play.png
* **icon-view-previous**:
.. image:: ../img/7/actions/view-previous.png
* **icon-calendar-dark**:
.. image:: ../img/7/places/calendar-dark.png
* **icon-contacts-dark**:
.. image:: ../img/7/places/contacts-dark.png
* **icon-file**:
.. image:: ../img/7/places/file.png
* **icon-files**:
.. image:: ../img/7/places/files.png
* **icon-folder**:
.. image:: ../img/7/places/folder.png
* **icon-filetype-text**:
.. image:: ../img/7/filetypes/text.png
* **icon-filetype-folder**:
.. image:: ../img/7/filetypes/folder.png
* **icon-home**:
.. image:: ../img/7/places/home.png
* **icon-link**:
.. image:: ../img/7/places/link.png
* **icon-music**:
.. image:: ../img/7/places/music.png
* **icon-picture**:
.. image:: ../img/7/places/picture.png

View File

@ -96,7 +96,7 @@ Files and folders can also be accessed by id, by calling the **getById** method
}
public function getContent($id) {
// check if file exists and write to it if possible
// check if file exists and read from it if possible
try {
$file = $this->storage->getById($id);
if($file instanceof \OCP\Files\File) {

View File

@ -4,253 +4,368 @@ App Metadata
.. sectionauthor:: Bernhard Posselt <dev@bernhard-posselt.com>
The :file:`appinfo/info.xml` contains metadata about the app:
The :file:`appinfo/info.xml` contains metadata about the app. A detailed documentation can be found at the `app store documentation <https://nextcloudappstore.readthedocs.io/en/latest/developer.html#info-xml>`_.
The info.xml is validated using an XML Schema which can be accessed `online <https://apps.nextcloud.com/schema/apps/info.xsd>`_.
A minimum valid **info.xml** would look like this:
.. code-block:: xml
<?xml version="1.0"?>
<info>
<id>yourappname</id>
<name>Your App</name>
<description>Your App description</description>
<version>1.0</version>
<licence>AGPL</licence>
<author>Your Name</author>
<namespace>YourAppsNamespace</namespace>
<?xml version="1.0"?>
<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>news</id>
<name>News</name>
<summary>An RSS/Atom feed reader</summary>
<description>An RSS/Atom feed reader</description>
<version>8.8.2</version>
<licence>agpl</licence>
<author>Bernhard Posselt</author>
<category>multimedia</category>
<bugs>https://github.com/nextcloud/news/issues</bugs>
<dependencies>
<nextcloud min-version="10"/>
</dependencies>
</info>
<types>
<filesystem/>
</types>
A full blown example would look like this (needs to be utf-8 encoded):
.. code-block:: xml
<documentation>
<user>https://docs.nextcloud.org</user>
<admin>https://docs.nextcloud.org</admin>
<developer>https://docs.nextcloud.org</developer>
</documentation>
<?xml version="1.0"?>
<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>news</id>
<name lang="de">Nachrichten</name>
<name>News</name>
<summary lang="en">An RSS/Atom feed reader</summary>
<description lang="en"># Description\nAn RSS/Atom feed reader</description>
<description lang="de"><![CDATA[# Beschreibung\nEine Nachrichten App, welche mit [RSS/Atom](https://en.wikipedia.org/wiki/RSS) umgehen kann]]></description>
<version>8.8.2</version>
<licence>agpl</licence>
<author mail="mail@provider.com" homepage="http://example.com">Bernhard Posselt</author>
<author>Alessandro Cosentino</author>
<author>Jan-Christoph Borchardt</author>
<documentation>
<user>https://github.com/nextcloud/news/wiki#user-documentation</user>
<admin>https://github.com/nextcloud/news#readme</admin>
<developer>https://github.com/nextcloud/news/wiki#developer-documentation</developer>
</documentation>
<category>multimedia</category>
<category>tools</category>
<website>https://github.com/nextcloud/news</website>
<discussion>https://your.forum.com</discussion>
<bugs>https://github.com/nextcloud/news/issues</bugs>
<repository>https://github.com/nextcloud/news</repository>
<screenshot small-thumbnail="https://example.com/1-small.png">https://example.com/1.png</screenshot>
<screenshot>https://example.com/2.jpg</screenshot>
<dependencies>
<php min-version="5.6" min-int-size="64"/>
<database min-version="9.4">pgsql</database>
<database>sqlite</database>
<database min-version="5.5">mysql</database>
<command>grep</command>
<command>ls</command>
<lib min-version="2.7.8">libxml</lib>
<lib>curl</lib>
<lib>SimpleXML</lib>
<lib>iconv</lib>
<nextcloud min-version="9" max-version="10"/>
</dependencies>
<background-jobs>
<job>OCA\DAV\CardDAV\Sync\SyncJob</job>
</background-jobs>
<repair-steps>
<pre-migration>
<step>OCA\DAV\Migration\Classification</step>
</pre-migration>
<post-migration>
<step>OCA\DAV\Migration\Classification</step>
</post-migration>
<live-migration>
<step>OCA\DAV\Migration\GenerateBirthdays</step>
</live-migration>
<install>
<step>OCA\DAV\Migration\GenerateBirthdays</step>
</install>
<uninstall>
<step>OCA\DAV\Migration\GenerateBirthdays</step>
</uninstall>
</repair-steps>
<two-factor-providers>
<provider>OCA\AuthF\TwoFactor\Provider</provider>
</two-factor-providers>
<commands>
<command>A\Php\Class</command>
</commands>
<settings>
<admin>OCA\Theming\Settings\Admin</admin>
<admin-section>OCA\Theming\Settings\Section</admin-section>
</settings>
<activity>
<settings>
<setting>OCA\Files\Activity\Settings\FavoriteAction</setting>
<setting>OCA\Files\Activity\Settings\FileChanged</setting>
<setting>OCA\Files\Activity\Settings\FileCreated</setting>
<setting>OCA\Files\Activity\Settings\FileDeleted</setting>
<setting>OCA\Files\Activity\Settings\FileFavorite</setting>
<setting>OCA\Files\Activity\Settings\FileRestored</setting>
</settings>
<category>tool</category>
<filters>
<filter>OCA\Files\Activity\Filter\FileChanges</filter>
<filter>OCA\Files\Activity\Filter\Favorites</filter>
</filters>
<website>https://example.org</website>
<providers>
<provider>OCA\Files\Activity\FavoriteProvider</provider>
<provider>OCA\Files\Activity\Provider</provider>
</providers>
</activity>
<navigations>
<navigation role="admin">
<id>files</id>
<name>Files</name>
<route>files.view.index</route>
<order>0</order>
<icon>app.svg</icon>
<type>link</type>
</navigation>
</navigations>
<collaboration>
<plugins>
<plugin type="collaborator-search" share-type="SHARE_TYPE_CIRCLE">OCA\Circles\Collaboration\v1\CollaboratorSearchPlugin</plugin>
</plugins>
</collaboration>
</info>
<bugs>https://github.com/nextcloud/theapp/issues</bugs>
<repository type="git">https://github.com/nextcloud/theapp.git</repository>
<ocsid>1234</ocsid>
<dependencies>
<php min-version="5.6" max-version="7.1"/>
<database>sqlite</database>
<database>mysql</database>
<command os="linux">grep</command>
<command os="windows">notepad.exe</command>
<lib min-version="1.2">xml</lib>
<lib max-version="2.0">intl</lib>
<lib>curl</lib>
<os>Linux</os>
<owncloud min-version="6.0.4" max-version="8"/>
</dependencies>
<settings>
<admin-section>OCA\YourAppsNamespace\Settings\AdminSection</admin-section>
<admin>OCA\YourAppsNamespace\Settings\AdminSettings</admin>
</settings>
<!-- deprecated, just for reference -->
<requiremin>5</requiremin>
<public>
<file id="caldav">appinfo/caldav.php</file>
</public>
<remote>
<file id="caldav">appinfo/caldav.php</file>
</remote>
<standalone />
<default_enable />
<shipped>true</shipped>
<!-- end deprecated -->
</info>
The following tags are validated and used in the following way:
id
--
**Required**: This field contains the internal app name, and has to be the same as the folder name of the app. This id needs to be unique in Nextcloud, meaning no other app should have this id.
* required
* must contain only lowercase ASCII characters and underscore
* must match the first folder in the archive
* will be used to identify the app
name
----
**Required**: This is the human-readable name/title of the app that will be displayed in the app overview page.
* required
* must occur at least once with **lang="en"** or no lang attribute
* can be translated by using multiple elements with different **lang** attribute values, language code needs to be set **lang** attribute
* will be rendered on the app detail page
summary
* optional
* if not provided the description element's text will be used
* must occur at least once with **lang="en"** or no lang attribute
* can be translated by using multiple elements with different **lang** attribute values, language code needs to be set **lang** attribute
* will be rendered on the app list page as short description
description
-----------
**Required**: This contains the description of the app which will be shown in the app overview page.
* required
* must occur at least once with **lang="en"** or no lang attribute
* can contain Markdown
* can be translated by using multiple elements with different **lang** attribute values, language code needs to be set **lang** attribute
* will be rendered on the app detail page
version
-------
Contains the version of your app.
* required
* must be a `semantic version <http://semver.org/>`_ without build metadata, e.g. 9.0.1 or 9.1.0-alpha.1
licence
-------
**Required**: The licence of the app. This licence must be compatible with the AGPL and **must not be proprietary**, for instance:
* AGPL 3 (recommended)
* MIT
* required
* must contain **agpl**, **mpl*** and/or **apache** as the only valid values. These refer to the AGPLv3, MPL 2.0 and Apache License 2.0
author
------
**Required**: The name of the app author or authors.
namespace
---------
Required if routes.php returns an array. If your app is namespaced like **\\OCA\\MyApp\\Controller\\PageController** the required namespace value is **MyApp**. If not given it tries to default to the first letter upper cased app id, e.g. **myapp** would be tried under **Myapp**
types
-----
Nextcloud allows to specify four kind of ``types``. Currently supported ``types``:
* **prelogin**: apps which need to load on the login page
* **filesystem**: apps which provide filesystem functionality (e.g. files sharing app)
* **authentication**: apps which provide authentication backends
* **logging**: apps which implement a logging system
* **prevent_group_restriction**: apps which can not be enabled for specific groups (e.g. notifications app).
.. note::
Due to technical reasons apps of any type listed above can not be enabled for specific groups only.
documentation
-------------
Link to 'admin', 'user', 'developer' documentation
website
-------
Link to project web page
repository
----------
Link to the version control repo
bugs
----
Link to the bug tracker
* required
* can occur multiple times with different authors
* can contain a **mail** attribute which must be an email
* can contain a **homepage** which must be an URL
* will not (yet) be rendered on the App Store
* will be provided through the REST API
documentation/user
* optional
* must contain an URL to the user documentation
* will be rendered on the app detail page
documentation/admin
* optional
* must contain an URL to the admin documentation
* will be rendered on the app detail page
documentation/developer
* optional
* must contain an URL to the developer documentation
* will be rendered on the app detail page
category
--------
Category on the app store. Can be one of the following:
* optional
* if not provided the category **tools** will be used
* must contain one of the following values:
* auth
* customization
* files
* games
* integration
* monitoring
* multimedia
* office
* organization
* social
* tools
* **customization**
* **files**
* **games**
* **integration**
* **monitoring**
* **multimedia**
* **office**
* **organization**
* **security**
* **social**
* **tools**
ocsid
-----
The app's id on the app store, e.g.: https://apps.owncloud.com/content/show.php/QOwnNotes?content=168497 would have the ocsid **168497**. If given helps users to install and update the same app from the app store
* old categories are migrated:
Dependencies
------------
All tags within the dependencies tag define a set of requirements which have to be fulfilled in order to operate
properly. As soon as one of these requirements is not met the app cannot be installed.
* **auth** will be converted to **security**
php
===
Defines the minimum and the maximum version of PHP which is required to run this app.
* can occur more than once with different categories
website
* optional
* must contain an URL to the project's homepage
* will be rendered on the app detail page
discussion
* optional
* must contain an URL to the project's discussion page/forum
* will be rendered on the app detail page as the "ask question or discuss" button
* if absent, it will default to our forum at https://help.nextcloud.com/ and create a new category in the apps category
bugs
* required
* must contain an URL to the project's bug tracker
* will be rendered on the app detail page
repository
* optional
* must contain an URL to the project's repository
* can contain a **type** attribute, **git**, **mercurial**, **subversion** and **bzr** are allowed values, defaults to **git**
* currently not used
screenshot
* optional
* must contain an HTTPS URL to an image
* can contain a **small-thumbnail** attribute which must contain an https url to an image. This image will be used as small preview (e.g. on the app list overview). Keep it small so it renders fast
* will be rendered on the app list and detail page in the given order
dependencies/php
* optional
* can contain a **min-version** attribute (maximum 3 digits separated by dots)
* can contain a **max-version** attribute (maximum 3 digits separated by dots)
* can contain a **min-int-size** attribute, 32 or 64 are allowed as valid values
* will be rendered on the app releases page
dependencies/database
* optional
* must contain the database name as text, **sqlite**, **pgsql** and **mysql** are allowed as valid values
* can occur multiple times with different databases
* can contain a **min-version** attribute (maximum 3 digits separated by dots)
* can contain a **max-version** attribute (maximum 3 digits separated by dots)
* will be rendered on the app releases page
dependencies/command
* optional
* must contain a linux command as text value
* can occur multiple times with different commands
* will be rendered on the app releases page
dependencies/lib
* optional
* will be rendered on the app releases page
* must contain a required php extension
* can occur multiple times with different php extensions
* can contain a **min-version** attribute (maximum 3 digits separated by dots)
* can contain a **max-version** attribute (maximum 3 digits separated by dots)
dependencies/nextcloud
* required on Nextcloud 11 or higher
* if absent white-listed owncloud versions will be taken from the owncloud element (see below)
* must contain a **min-version** attribute (maximum 3 digits separated by dots)
* can contain a **max-version** attribute (maximum 3 digits separated by dots)
background-jobs/job
* optional
* must contain a php class which is run as background jobs
* will not be used, only validated
repair-steps/pre-migration/step
* optional
* must contain a php class which is run before executing database migrations
* will not be used, only validated
repair-steps/post-migration/step
* optional
* must contain a php class which is run after executing database migrations
* will not be used, only validated
repair-steps/live-migration/step
* optional
* must contain a php class which is run after executing post-migration jobs
* will not be used, only validated
repair-steps/install/step
* optional
* must contain a php class which is run after installing the app
* will not be used, only validated
repair-steps/uninstall/step
* optional
* must contain a php class which is run after uninstalling the app
* will not be used, only validated
two-factor-providers/provider
* optional
* must contain a php class which is registered as two factor auth provider
* will not be used, only validated
commands/command
* optional
* must contain a php class which is registered as occ command
* will not be used, only validated
activity/settings/setting
* optional
* must contain a php class which implements OCP\Activity\ISetting and is used to add additional settings ui elements to the activity app
activity/filters/filter
* optional
* must contain a php class which implements OCP\Activity\IFilter and is used to add additional filters to the activity app
activity/providers/provider
* optional
* must contain a php class which implements OCP\Activity\IProvider and is used to react to events from the activity app
settings/admin
* optional
* must contain a php class which implements OCP\Settings\ISettings and returns the form to render for the global settings area
settings/admin-section
* optional
* must contain a php class which implements OCP\Settings\ISection and returns data to render navigation entries in the global settings area
navigations
* optional
* must contain at least one navigation element
navigations/navigation
* required
* must contain a name and route element
* denotes a navigation entry
* role denotes the visibility, all means everyone can see it, admin means only an admin can see the navigation entry, defaults to all
navigations/navigation/id
* optional
* the app id
* you can also create entries for other apps by setting an id other than your app one's
navigations/navigation/name
* required
* will be displayed below the navigation entry icon
* will be translated by the default translation tools
navigations/navigation/route
* required
* name of the route that will be used to generate the link
navigations/navigation/icon
* optional
* name of the icon which is looked up in the app's **img/** folder
* defaults to app.svg
navigations/navigation/order
* optional
* used to sort the navigation entries
* a higher order number means that the entry will be ordered further to the bottom
navigations/navigation/type
* optional
* can be either link or settings
* link means that the entry is added to the default app menu
* settings means that the entry is added to the right-side menu which also contains the personal, admin, users, help and logout entry
collaboration
* optional
* can contain plugins for collaboration search (e.g. supplying share dialog)
collaboration/plugins
* optional
* must contain at least one plugin
collaboration/plugins/plugin
* required
* the PHP class name of the plugin
* must contain **type** attribute (currently only *collaboration-search*). The class must implement OCP\Collaboration\Collaborators\ISearchPlugin.
* must contain **share-type** attribute, according to the specific \OCP\Share constants
database
========
Each supported database has to be listed in here. Valid values are sqlite, mysql, pgsql, oci and mssql. In the future
it will be possible to specify versions here as well.
In case no database is specified it is assumed that all databases are supported.
The following character maximum lengths are enforced:
command
=======
Defines a command line tool to be available. With the attribute 'os' the required operating system for this tool can be
specified. Valid values for the 'os' attribute are as returned by the PHP function `php_uname <http://php.net/manual/en/function.php-uname.php>`_.
* All description Strings are database text fields and therefore not limited in size
* All other Strings have a maximum of 256 characters
lib
===
Defines a required PHP extension with required minimum and/or maximum version. The names for the libraries have to match the result as returned by the PHP function `get_loaded_extensions <http://php.net/manual/en/function.get-loaded-extensions.php>`_.
The explicit version of an extension is read from `phpversion <http://php.net/manual/de/function.phpversion.php>`_ - with some exception as to be read up in the `code base <https://github.com/nextcloud/server/blob/master/lib/private/App/PlatformRepository.php>`_.
The following elements are either deprecated or for internal use only and will fail the validation if present:
os
==
Defines the required target operating system the app can run on. Valid values are as returned by the PHP function `php_uname <http://php.net/manual/en/function.php-uname.php>`_.
owncloud
========
**Required**: Defines minimum and maximum versions of the Nextcloud core. In case undefined the values will be taken from the tag `requiremin`_.
.. note:: Currently this tag is also used to check for the Nextcloud version number.
Thereby the following "translation" is made:
* ownCloud 9.0 matches Nextcloud 9
* ownCloud 9.1 matches Nextcloud 10
* ownCloud 9.2 matches Nextcloud 11
settings
--------
When your app has admin settings, this is the place to register the corresponding classes.
admin-section
=============
In case the app needs to register a new section on the admin settings page, it needs to implement the \OCP\Settings\ISection interface. The implementing class needs to be specified here.
admin
=====
In case the app has its own admin related settings, it needs to implement the \OCP\Settings\ISettings interface. The implementing class needs to be specified here.
Deprecated
----------
The following sections are just listed for reference and should not be used; they are deprecated and often not evaluated anymore (i.e., they are ignored).
requiremin
==========
Deprecated in favor of the **<dependencies>** tag.
public
======
Used to provide a public interface (requires no login) for the app. The id is appended to the URL **/index.php/public**. Example with id set to 'calendar'::
/index.php/public/calendar
Also take a look at :doc:`../core/externalapi`.
remote
======
Same as public but requires login. The id is appended to the URL **/index.php/remote**. Example with id set to 'calendar'::
/index.php/remote/calendar
Also take a look at :doc:`../core/externalapi`.
standalone
==========
Can be set to true to indicate that this app is a webapp. This can be used to tell GNOME Web for instance to treat this like a native application.
default_enable
==============
**Core apps only**: Used to tell Nextcloud to enable them after the installation.
shipped
=======
**Core apps only**: Used to tell Nextcloud that the app is in the standard release.
Please note that if this attribute is set to *FALSE* or not set at all, every time you disable the application, all the files of the application itself will be *REMOVED* from the server!
* **standalone**
* **default_enable**
* **shipped**
* **public**
* **remote**
* **requiremin**
* **requiremax**

View File

@ -4,35 +4,30 @@ Navigation and Pre-App configuration
.. sectionauthor:: Bernhard Posselt <dev@bernhard-posselt.com>
The :file:`appinfo/app.php` is the first file that is loaded and executed in Nextcloud. Depending on the purpose of the app it usually just contains the navigation setup, and maybe :doc:`backgroundjobs` and :doc:`hooks` registrations. This is how an example :file:`appinfo/app.php` could look like:
Adding a navigation entry
=========================
Navigation entries for apps can be created by adding a navigation section to the :file:`appinfo/info.xml` file, containing the name, order and route the navigation entry should link to. For details on the XML schema check the `app store documentation <https://nextcloudappstore.readthedocs.io/en/latest/developer.html#info-xml>`_.
.. code-block:: xml
<navigation>
<name>MyApp</name>
<route>myapp.page.index</route>
<order>0</order>
</navigation>
Further pre-app configuration
=============================
The :file:`appinfo/app.php` is the first file that is loaded and executed in Nextcloud. Depending on the purpose of the app it is usually used to setup things that need to be available on every request to the server, like :doc:`backgroundjobs` and :doc:`hooks` registrations. This is how an example :file:`appinfo/app.php` could look like:
.. code-block:: php
<?php
\OC::$server->getNavigationManager()->add(function () {
$urlGenerator = \OC::$server->getURLGenerator();
return [
// the string under which your app will be referenced in Nextcloud
'id' => 'myapp',
// sorting weight for the navigation. The higher the number, the higher
// will it be listed in the navigation
'order' => 10,
// the route that will be shown on startup
'href' => $urlGenerator->linkToRoute('myapp.page.index'),
// the icon that will be shown in the navigation
// this file needs to exist in img/
'icon' => $urlGenerator->imagePath('myapp', 'app.svg'),
// the title of your application. This will be used in the
// navigation or on the settings page of your app
'name' => \OC::$server->getL10N('myapp')->t('My App'),
];
});
// execute OCA\MyApp\BackgroundJob\Task::run when cron is called
\OC::$server->getJobList()->add('OCA\MyApp\BackgroundJob\Task');
@ -48,3 +43,35 @@ Although it is also possible to include :doc:`js` or :doc:`css` for other apps b
\OCP\Util::addScript('myapp', 'script'); // include js/script.js for every app
\OCP\Util::addStyle('myapp', 'style'); // include css/style.css for every app
Best practice
=============
A common way to have a cleaner code structure is to create a class Application in :file:`lib/AppInfo/Application.php` that will then execute your setup of hooks or background tasks. You can then just call it in your :file:`appinfo/app.php`. That way you can also make use of Nextclouds dependency injection feature and properly test those methods.
appinfo/app.php
---------------
.. code-block:: php
<?php
$app = new \OCA\MyApp\AppInfo\Application();
$app->registerHooks();
lib/AppInfo/Application.php
---------------------------
.. code-block:: php
<?php
namespace OCA\MyApp\AppInfo;
class Application extends App {
public function registerHooks() {
\OCP\Util::connectHook('OC_User', 'pre_deleteUser', 'OCA\MyApp\Hooks\User', 'deleteUser');
}
}

View File

@ -4,55 +4,22 @@ Routing
.. sectionauthor:: Bernhard Posselt <dev@bernhard-posselt.com>
Routes map a URL and a method to a controller method. Routes are defined inside :file:`appinfo/routes.php` by passing a configuration array to the registerRoutes method. An example route would look like this:
Routes map a URL and a method to a controller method. Routes are defined inside :file:`appinfo/routes.php` by returning them as an array:
.. code-block:: php
<?php
namespace OCA\MyApp\AppInfo;
$application = new Application();
$application->registerRoutes($this, array(
'routes' => array(
array('name' => 'page#index', 'url' => '/', 'verb' => 'GET'),
)
));
return [
'routes' => [
['name' => 'page#index', 'url' => '/', 'verb' => 'GET'],
],
];
The route array contains the following parts:
* **url**: The URL that is matched after */index.php/apps/myapp*
* **name**: The controller and the method to call; *page#index* is being mapped to *PageController->index()*, *articles_api#drop_latest* would be mapped to *ArticlesApiController->dropLatest()*. The controller that matches the page#index name would have to be registered in the following way inside :file:`appinfo/application.php`:
.. code-block:: php
<?php
namespace OCA\MyApp\AppInfo;
use \OCP\AppFramework\App;
use \OCA\MyApp\Controller\PageController;
class Application extends App {
public function __construct(array $urlParams=array()){
parent::__construct('myapp', $urlParams);
$container = $this->getContainer();
/**
* Controllers
*/
$container->registerService('PageController', function($c) {
return new PageController(
$c->query('AppName'),
$c->query('Request')
);
});
}
}
* **name**: The controller and the method to call; *page#index* is being mapped to *PageController->index()*, *articles_api#drop_latest* would be mapped to *ArticlesApiController->dropLatest()*. The controller in the example above would be stored in :file:`lib/Controller/PageController.php`.
* **method** (Optional, defaults to GET): The HTTP method that should be matched, (e.g. GET, POST, PUT, DELETE, HEAD, OPTIONS, PATCH)
* **requirements** (Optional): lets you match and extract URLs that have slashes in them (see :ref:`matching-suburls`)
* **postfix** (Optional): lets you define a route id postfix. Since each route name will be transformed to a route id (**page#method** -> **myapp.page.method**) and the route id can only exist once you can use the postfix option to alter the route id creation by adding a string to the route id, e.g., **'name' => 'page#method', 'postfix' => 'test'** will yield the route id **myapp.page.methodtest**. This makes it possible to add more than one route/URL for a controller method
@ -150,75 +117,34 @@ To prevent repetition, it's possible to define resources. The following routes:
.. code-block:: php
<?php
namespace OCA\MyApp\AppInfo;
$application = new Application();
$application->registerRoutes($this, array(
'routes' => array(
array('name' => 'author#index', 'url' => '/authors', 'verb' => 'GET'),
array('name' => 'author#show', 'url' => '/authors/{id}', 'verb' => 'GET'),
array('name' => 'author#create', 'url' => '/authors', 'verb' => 'POST'),
array('name' => 'author#update', 'url' => '/authors/{id}', 'verb' => 'PUT'),
array('name' => 'author#destroy', 'url' => '/authors/{id}', 'verb' => 'DELETE'),
return [
'routes' => [
['name' => 'author#index', 'url' => '/authors', 'verb' => 'GET'],
['name' => 'author#show', 'url' => '/authors/{id}', 'verb' => 'GET'],
['name' => 'author#create', 'url' => '/authors', 'verb' => 'POST'],
['name' => 'author#update', 'url' => '/authors/{id}', 'verb' => 'PUT'],
['name' => 'author#destroy', 'url' => '/authors/{id}', 'verb' => 'DELETE'],
// your other routes here
)
));
],
];
can be abbreviated by using the **resources** key:
.. code-block:: php
<?php
namespace OCA\MyApp\AppInfo;
$application = new Application();
$application->registerRoutes($this, array(
'resources' => array(
'author' => array('url' => '/authors')
),
'routes' => array(
return [
'resources' => [
'author' => [url' => '/authors'],
],
'routes' => [
// your other routes here
)
));
],
];
Using the URLGenerator
========================
Sometimes it is useful to turn a route into a URL to make the code independent from the URL design or to generate a URL for an image in **img/**. For that specific use case, the ServerContainer provides a service that can be used in your container:
.. code-block:: php
<?php
namespace OCA\MyApp\AppInfo;
use \OCP\AppFramework\App;
use \OCA\MyApp\Controller\PageController;
class Application extends App {
public function __construct(array $urlParams=array()){
parent::__construct('myapp', $urlParams);
$container = $this->getContainer();
/**
* Controllers
*/
$container->registerService('PageController', function($c) {
return new PageController(
$c->query('AppName'),
$c->query('Request'),
// inject the URLGenerator into the page controller
$c->query('ServerContainer')->getURLGenerator()
);
});
}
}
Inside the PageController the URL generator can now be used to generate a URL for a redirect:
Sometimes it is useful to turn a route into a URL to make the code independent from the URL design or to generate a URL for an image in **img/**. Inside the PageController the URL generator can be injected by adding it to the constructor, which will allow to use it to generate a URL for a redirect. For more details on that see the :ref:`dependency-injection` reference.
.. code-block:: php

View File

@ -20,6 +20,7 @@ The following directories have now been created:
* **appinfo/**: Contains app metadata and configuration
* **css/**: Contains the CSS
* **img/**: Contains icons and images
* **js/**: Contains the JavaScript files
* **lib/**: Contains the PHP class files of your app
* **templates/**: Contains the templates

View File

@ -13,6 +13,10 @@
import sys, os
# import global configuration from parent directory
sys.path.insert(0, os.path.abspath('../'))
from conf import *
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
@ -40,17 +44,17 @@ source_suffix = '.rst'
master_doc = 'index'
# General information about the project.
project = u'Nextcloud Developer Manual'
copyright = u'2012-2017, The Nextcloud developers'
project = u'Nextcloud %s Developer Manual' % (version)
#copyright = u'2012-2017, The Nextcloud developers'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = '12'
#version = '13'
# The full version, including alpha/beta/rc tags.
release = '12'
#release = '13'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
@ -179,7 +183,7 @@ latex_elements = {
#'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#'preamble': '',
'preamble': '\extrafloats{100}\maxdeadcycles=500',
}
# Grouping the document tree into LaTeX files. List of tuples
@ -298,3 +302,11 @@ intersphinx_mapping = {
'admin_manual': ('https://docs.nextcloud.com/server/%s/admin_manual/' % (version), '../admin_manual/_build/html/com/objects.inv'),
'user_manual': ('https://docs.nextcloud.com/server/%s/user_manual/' % (version), '../user_manual/_build/html/com/objects.inv'),
}
from sphinx.builders.html import StandaloneHTMLBuilder
StandaloneHTMLBuilder.supported_image_types = [
'image/svg+xml',
'image/gif',
'image/png',
'image/jpeg'
]

View File

@ -113,7 +113,7 @@ App config
Using alternative app directories
---------------------------------
Nextcloud can be set to use a custom app directory in /config/config.php. Customise the following code and add it to your config file:
Nextcloud can be set to use a custom app directory in /config/config.php. Customize the following code and add it to your config file:
.. code-block:: php

View File

@ -0,0 +1,7 @@
.. sectionauthor:: John Molakvoæ <skjnldsv@protonmail.com>
.. codeauthor:: John Molakvoæ <skjnldsv@protonmail.com>
.. _content:
===============
Main content
===============

View File

@ -0,0 +1,79 @@
.. sectionauthor:: John Molakvoæ <skjnldsv@protonmail.com>
.. codeauthor:: John Molakvoæ <skjnldsv@protonmail.com>
.. _html:
===============
Html elements
===============
Progress bar
=============
Nextcloud support and provides an already themed progress bar.
Please use the html5 ``progress`` element.
.. figure:: ../images/progress.png
:alt: Progress html5
:figclass: figure-with-code
.. code-block:: html
<progress value="42.79" max="100"></progress>
.. _checkboxes-and-radios:
Checkboxes and radios
======================
As default html5 checkboxes & radios are **not** customizable, we created an override using label and ``::after`` elements.
There are 2 colors:
* Default themed with the primary color.
* White colored.
Requirements:
* You need to have a ``label`` element **directly** after the ``input`` element.
* The input **must** have the ``checkbox`` or ``radio`` class.
* To use the white theme, you **need** to also add the ``checkbox--white`` or ``radio--white`` class.
* Your label **must** have an associated text for accessibility.
.. figure:: ../images/checkboxes.png
:alt: Nextcloud's themed checkboxes
:figclass: figure-with-code
.. code-block:: html
<input type="checkbox" id="test1" class="checkbox"
checked="checked">
<label for="test1">Selected</label><br>
<input type="checkbox" id="test2" class="checkbox">
<label for="test2">Unselected</label><br>
<input type="checkbox" id="test3" class="checkbox"
disabled="disabled">
<label for="test3">Disabled</label><br>
<input type="checkbox" id="test4" class="checkbox">
<label for="test4">Hovered</label><br>
.. figure:: ../images/radios.png
:alt: Nextcloud's themed radios
:figclass: figure-with-code
.. code-block:: html
<input type="radio" id="test1" class="radio"
checked="checked">
<label for="test1">Selected</label><br>
<input type="radio" id="test2" class="radio">
<label for="test2">Unselected</label><br>
<input type="radio" id="test3" class="radio"
disabled="disabled">
<label for="test3">Disabled</label><br>
<input type="radio" id="test4" class="radio">
<label for="test4">Hovered</label><br>
Buttons
==================

View File

@ -0,0 +1,39 @@
#! /bin/env python
# Generate the icon part of the design documentation
# coding=utf8
# the above tag defines encoding for this document and is for Python 2.x compatibility
import re
import os
iconregex = re.compile("(\.icon-[a-z-]*)")
pathregex = r"url\('([a-z-./]*\.svg)"
os.system('rm -R ./img/')
os.system('rm icons.txt')
os.system('wget https://github.com/nextcloud/server/archive/master.zip')
os.system("unzip -p master.zip 'server-master/core/css/icons.scss' > icons.scss")
os.system("unzip -u master.zip 'server-master/core/img/*'")
os.system('mv ./server-master/core/img .')
os.system('rm master.zip')
os.system('rm -R ./server-master/')
icons = {}
scss = open('icons.scss')
lines = scss.readlines()
for i, line in enumerate(lines):
for match in re.finditer(pathregex, line):
iconclass = iconregex.match(lines[i-1])
if iconclass:
icons[iconclass.groups()[0]] = match.groups()[0]
result = ""
for icon, path in sorted(icons.items()):
result += ".. figure:: " + path[3:-3]+"*\n :height: 32\n :width: 32\n\n " + icon[1:] + "\n\n"
os.system('inkscape -z '+path[3:]+' -e '+path[3:-3]+'png')
f = open('icons.txt', 'w')
f.write(result);
f.close()

View File

@ -0,0 +1,12 @@
.. sectionauthor:: John Molakvoæ <skjnldsv@protonmail.com>
.. codeauthor:: John Molakvoæ <skjnldsv@protonmail.com>
.. _icons:
========
Icons
========
White icons only have a grey background on this documentation page for readability purposes.
.. include:: icons.txt
:class: icons-flex

View File

@ -0,0 +1,551 @@
/**
* @copyright Copyright (c) 2016, John Molakvoæ <skjnldsv@protonmail.com>
* @copyright Copyright (c) 2016, Joas Schilling <coding@schilljs.com>
* @copyright Copyright (c) 2016, Lukas Reschke <lukas@statuscode.ch>
* @copyright Copyright (c) 2016, Roeland Jago Douma <roeland@famdouma.nl>
* @copyright Copyright (c) 2016, Vincent Chan <plus.vincchan@gmail.com>
* @copyright Copyright (c) 2015, Thomas Müller <thomas.mueller@tmit.eu>
* @copyright Copyright (c) 2015, Hendrik Leppelsack <hendrik@leppelsack.de>
* @copyright Copyright (c) 2015, Jan-Christoph Borchardt <hey@jancborchardt.net>
*
* @license GNU AGPL version 3 or any later version
*
*/
/* GLOBAL ------------------------------------------------------------------- */
[class^='icon-'], [class*=' icon-'] {
background-repeat: no-repeat;
background-position: center;
min-width: 16px;
min-height: 16px;
}
.icon-breadcrumb {
background-image: url('../img/breadcrumb.svg?v=1');
}
/* LOADING ------------------------------------------------------------------ */
.loading, .loading-small, .icon-loading, .icon-loading-dark, .icon-loading-small, .icon-loading-small-dark {
position: relative;
&:after {
z-index: 2;
content: '';
height: 28px;
width: 28px;
margin: -16px 0 0 -16px;
position: absolute;
top: 50%;
left: 50%;
border-radius: 100%;
-webkit-animation: rotate .8s infinite linear;
animation: rotate .8s infinite linear;
-webkit-transform-origin: center;
-ms-transform-origin: center;
transform-origin: center;
border: 2px solid rgba($color-loading, 0.5);
border-top-color: $color-loading;
}
}
.icon-loading-dark:after,
.icon-loading-small-dark:after {
border: 2px solid rgba($color-loading-dark, 0.5);
border-top-color: $color-loading-dark;
}
.icon-loading-small:after,
.icon-loading-small-dark:after {
height: 12px;
width: 12px;
margin: -8px 0 0 -8px;
}
/* Css replaced elements don't have ::after nor ::before */
img, object, video, button, textarea, input, select {
.icon-loading {
background-image: url('../img/loading.gif');
}
.icon-loading-dark {
background-image: url('../img/loading-dark.gif');
}
.icon-loading-small {
background-image: url('../img/loading-small.gif');
}
.icon-loading-small-dark {
background-image: url('../img/loading-small-dark.gif');
}
}
@keyframes rotate {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
.icon-32 {
background-size: 32px !important;
}
/* ICONS -------------------------------------------------------------------- */
.icon-add {
background-image: url('../img/actions/add.svg?v=1');
}
.icon-audio {
background-image: url('../img/actions/audio.svg?v=1');
}
.icon-audio-white {
background-image: url('../img/actions/audio-white.svg?v=2');
}
.icon-audio-off {
background-image: url('../img/actions/audio-off.svg?v=1');
}
.icon-audio-off-white {
background-image: url('../img/actions/audio-off-white.svg?v=1');
}
.icon-caret {
background-image: url('../img/actions/caret.svg?v=1');
}
.icon-caret-dark {
background-image: url('../img/actions/caret-dark.svg?v=1');
}
.icon-checkmark {
background-image: url('../img/actions/checkmark.svg?v=1');
}
.icon-checkmark-white {
background-image: url('../img/actions/checkmark-white.svg?v=1');
}
.icon-checkmark-color {
background-image: url('../img/actions/checkmark-color.svg?v=1');
}
.icon-clippy {
background-image: url('../img/actions/clippy.svg?v=2');
}
.icon-close {
background-image: url('../img/actions/close.svg?v=1');
}
.icon-close-white {
background-image: url('../img/actions/close-white.svg?v=1');
}
.icon-comment {
background-image: url('../img/actions/comment.svg?v=1');
}
.icon-confirm {
background-image: url('../img/actions/confirm.svg?v=2');
}
.icon-confirm-white {
background-image: url('../img/actions/confirm-white.svg?v=2');
}
.icon-delete {
background-image: url('../img/actions/delete.svg?v=1');
&.no-permission {
&:hover, &:focus {
background-image: url('../img/actions/delete.svg?v=1');
}
}
&:hover, &:focus {
background-image: url('../img/actions/delete-hover.svg?v=1');
}
}
.icon-delete-white {
background-image: url('../img/actions/delete-white.svg?v=1');
&.no-permission {
&:hover, &:focus {
background-image: url('../img/actions/delete-white.svg?v=1');
}
}
&:hover, &:focus {
background-image: url('../img/actions/delete-hover.svg?v=1');
}
}
.icon-details {
background-image: url('../img/actions/details.svg?v=1');
}
.icon-download {
background-image: url('../img/actions/download.svg?v=1');
}
.icon-download-white {
background-image: url('../img/actions/download-white.svg?v=1');
}
.icon-edit {
background-image: url('../img/actions/edit.svg?v=1');
}
.icon-error {
background-image: url('../img/actions/error.svg?v=1');
}
.icon-error-white {
background-image: url('../img/actions/error-white.svg?v=1');
}
.icon-error-color {
background-image: url('../img/actions/error-color.svg?v=1');
}
.icon-external {
background-image: url('../img/actions/external.svg?v=1');
}
.icon-fullscreen {
background-image: url('../img/actions/fullscreen.svg?v=1');
}
.icon-fullscreen-white {
background-image: url('../img/actions/fullscreen-white.svg?v=2');
}
.icon-history {
background-image: url('../img/actions/history.svg?v=1');
}
.icon-info {
background-image: url('../img/actions/info.svg?v=1');
}
.icon-info-white {
background-image: url('../img/actions/info-white.svg?v=1');
}
.icon-logout {
background-image: url('../img/actions/logout.svg?v=1');
}
.icon-mail {
background-image: url('../img/actions/mail.svg?v=1');
}
.icon-menu {
background-image: url('../img/actions/menu.svg?v=1');
}
.icon-more {
background-image: url('../img/actions/more.svg?v=1');
}
.icon-more-white {
background-image: url('../img/actions/more-white.svg?v=1');
}
.icon-password {
background-image: url('../img/actions/password.svg?v=1');
}
.icon-pause {
background-image: url('../img/actions/pause.svg?v=1');
}
.icon-pause-big {
background-image: url('../img/actions/pause-big.svg?v=1');
}
.icon-play {
background-image: url('../img/actions/play.svg?v=1');
}
.icon-play-add {
background-image: url('../img/actions/play-add.svg?v=1');
}
.icon-play-big {
background-image: url('../img/actions/play-big.svg?v=1');
}
.icon-play-next {
background-image: url('../img/actions/play-next.svg?v=1');
}
.icon-play-previous {
background-image: url('../img/actions/play-previous.svg?v=1');
}
.icon-public {
background-image: url('../img/actions/public.svg?v=1');
}
.icon-rename {
background-image: url('../img/actions/rename.svg?v=1');
}
.icon-screen {
background-image: url('../img/actions/screen.svg?v=1');
}
.icon-screen-white {
background-image: url('../img/actions/screen-white.svg?v=1');
}
.icon-screen-off {
background-image: url('../img/actions/screen-off.svg?v=1');
}
.icon-screen-off-white {
background-image: url('../img/actions/screen-off-white.svg?v=1');
}
.icon-search {
background-image: url('../img/actions/search.svg?v=1');
}
.icon-search-white {
background-image: url('../img/actions/search-white.svg?v=1');
}
.icon-settings {
background-image: url('../img/actions/settings.svg?v=1');
}
.icon-settings-dark {
background-image: url('../img/actions/settings-dark.svg?v=1');
}
.icon-settings-white {
background-image: url('../img/actions/settings-white.svg?v=1');
}
/* always use icon-shared, AdBlock blocks icon-share */
.icon-shared,
.icon-share {
background-image: url('../img/actions/share.svg?v=1');
}
.icon-sound {
background-image: url('../img/actions/sound.svg?v=1');
}
.icon-sound-off {
background-image: url('../img/actions/sound-off.svg?v=1');
}
.icon-favorite {
background-image: url('../img/actions/star-dark.svg?v=1');
}
.icon-star {
background-image: url('../img/actions/star.svg?v=1');
}
.icon-starred {
&:hover, &:focus {
background-image: url('../img/actions/star.svg?v=1');
}
background-image: url('../img/actions/starred.svg?v=1');
}
.icon-star {
&:hover, &:focus {
background-image: url('../img/actions/starred.svg?v=1');
}
}
.icon-tag {
background-image: url('../img/actions/tag.svg?v=1');
}
.icon-toggle {
background-image: url('../img/actions/toggle.svg?v=1');
}
.icon-toggle-pictures {
background-image: url('../img/actions/toggle-pictures.svg?v=1');
}
.icon-triangle-e {
background-image: url('../img/actions/triangle-e.svg?v=1');
}
.icon-triangle-n {
background-image: url('../img/actions/triangle-n.svg?v=1');
}
.icon-triangle-s {
background-image: url('../img/actions/triangle-s.svg?v=1');
}
.icon-upload {
background-image: url('../img/actions/upload.svg?v=1');
}
.icon-upload-white {
background-image: url('../img/actions/upload-white.svg?v=1');
}
.icon-user {
background-image: url('../img/actions/user.svg?v=1');
}
.icon-video {
background-image: url('../img/actions/video.svg?v=1');
}
.icon-video-white {
background-image: url('../img/actions/video-white.svg?v=2');
}
.icon-video-off {
background-image: url('../img/actions/video-off.svg?v=1');
}
.icon-video-off-white {
background-image: url('../img/actions/video-off-white.svg?v=1');
}
.icon-view-close {
background-image: url('../img/actions/view-close.svg?v=1');
}
.icon-view-download {
background-image: url('../img/actions/view-download.svg?v=1');
}
.icon-view-next {
background-image: url('../img/actions/view-next.svg?v=1');
}
.icon-view-pause {
background-image: url('../img/actions/view-pause.svg?v=1');
}
.icon-view-play {
background-image: url('../img/actions/view-play.svg?v=1');
}
.icon-view-previous {
background-image: url('../img/actions/view-previous.svg?v=1');
}
/* PLACES ------------------------------------------------------------------- */
.icon-calendar {
background-image: url('../img/places/calendar.svg?v=1');
}
.icon-calendar-dark {
background-image: url('../img/places/calendar-dark.svg?v=1');
}
.icon-contacts {
background-image: url('../img/places/contacts.svg?v=1');
}
.icon-contacts-dark {
background-image: url('../img/places/contacts-dark.svg?v=1');
}
.icon-files {
background-image: url('../img/places/files.svg?v=1');
}
.icon-files-dark {
background-image: url('../img/places/files-dark.svg?v=1');
}
.icon-file, .icon-filetype-text {
background-image: url('../img/filetypes/text.svg?v=1');
}
.icon-folder, .icon-filetype-folder {
background-image: url('../img/filetypes/folder.svg?v=1');
}
.icon-filetype-folder-drag-accept {
background-image: url('../img/filetypes/folder-drag-accept.svg?v=1') !important;
}
.icon-home {
background-image: url('../img/places/home.svg?v=1');
}
.icon-link {
background-image: url('../img/places/link.svg?v=1');
}
.icon-music {
background-image: url('../img/places/music.svg?v=1');
}
.icon-picture {
background-image: url('../img/places/picture.svg?v=1');
}
/* APP CATEGORIES ------------------------------------------------------------------- */
.icon-category-installed {
background-image: url('../img/actions/user.svg?v=1');
}
.icon-category-enabled {
background-image: url('../img/actions/checkmark.svg?v=1');
}
.icon-category-disabled {
background-image: url('../img/actions/close.svg?v=1');
}
.icon-category-app-bundles {
background-image: url('../img/categories/bundles.svg?v=1');
}
.icon-category-updates {
background-image: url('../img/actions/download.svg?v=1');
}
.icon-category-files {
background-image: url('../img/categories/files.svg?v=1');
}
.icon-category-social {
background-image: url('../img/categories/social.svg?v=1');
}
.icon-category-office {
background-image: url('../img/categories/office.svg?v=1');
}
.icon-category-auth {
background-image: url('../img/categories/auth.svg?v=1');
}
.icon-category-monitoring {
background-image: url('../img/categories/monitoring.svg?v=1');
}
.icon-category-multimedia {
background-image: url('../img/categories/multimedia.svg?v=1');
}
.icon-category-organization {
background-image: url('../img/categories/organization.svg?v=1');
}
.icon-category-customization {
background-image: url('../img/categories/customization.svg?v=1');
}
.icon-category-integration {
background-image: url('../img/categories/integration.svg?v=1');
}
.icon-category-tools {
background-image: url('../img/actions/settings-dark.svg?v=1');
}

View File

@ -0,0 +1,648 @@
.. figure:: img/actions/add.*
:height: 32
:width: 32
icon-add
.. figure:: img/actions/audio.*
:height: 32
:width: 32
icon-audio
.. figure:: img/actions/audio-off.*
:height: 32
:width: 32
icon-audio-off
.. figure:: img/actions/audio-off-white.*
:height: 32
:width: 32
icon-audio-off-white
.. figure:: img/actions/audio-white.*
:height: 32
:width: 32
icon-audio-white
.. figure:: img/breadcrumb.*
:height: 32
:width: 32
icon-breadcrumb
.. figure:: img/places/calendar.*
:height: 32
:width: 32
icon-calendar
.. figure:: img/places/calendar-dark.*
:height: 32
:width: 32
icon-calendar-dark
.. figure:: img/actions/caret.*
:height: 32
:width: 32
icon-caret
.. figure:: img/actions/caret-dark.*
:height: 32
:width: 32
icon-caret-dark
.. figure:: img/categories/bundles.*
:height: 32
:width: 32
icon-category-app-bundles
.. figure:: img/categories/auth.*
:height: 32
:width: 32
icon-category-auth
.. figure:: img/categories/customization.*
:height: 32
:width: 32
icon-category-customization
.. figure:: img/actions/close.*
:height: 32
:width: 32
icon-category-disabled
.. figure:: img/actions/checkmark.*
:height: 32
:width: 32
icon-category-enabled
.. figure:: img/categories/files.*
:height: 32
:width: 32
icon-category-files
.. figure:: img/actions/user.*
:height: 32
:width: 32
icon-category-installed
.. figure:: img/categories/integration.*
:height: 32
:width: 32
icon-category-integration
.. figure:: img/categories/monitoring.*
:height: 32
:width: 32
icon-category-monitoring
.. figure:: img/categories/multimedia.*
:height: 32
:width: 32
icon-category-multimedia
.. figure:: img/categories/office.*
:height: 32
:width: 32
icon-category-office
.. figure:: img/categories/organization.*
:height: 32
:width: 32
icon-category-organization
.. figure:: img/categories/social.*
:height: 32
:width: 32
icon-category-social
.. figure:: img/actions/settings-dark.*
:height: 32
:width: 32
icon-category-tools
.. figure:: img/actions/download.*
:height: 32
:width: 32
icon-category-updates
.. figure:: img/actions/checkmark.*
:height: 32
:width: 32
icon-checkmark
.. figure:: img/actions/checkmark-color.*
:height: 32
:width: 32
icon-checkmark-color
.. figure:: img/actions/checkmark-white.*
:height: 32
:width: 32
icon-checkmark-white
.. figure:: img/actions/clippy.*
:height: 32
:width: 32
icon-clippy
.. figure:: img/actions/close.*
:height: 32
:width: 32
icon-close
.. figure:: img/actions/close-white.*
:height: 32
:width: 32
icon-close-white
.. figure:: img/actions/comment.*
:height: 32
:width: 32
icon-comment
.. figure:: img/actions/confirm.*
:height: 32
:width: 32
icon-confirm
.. figure:: img/actions/confirm-white.*
:height: 32
:width: 32
icon-confirm-white
.. figure:: img/places/contacts.*
:height: 32
:width: 32
icon-contacts
.. figure:: img/places/contacts-dark.*
:height: 32
:width: 32
icon-contacts-dark
.. figure:: img/actions/delete.*
:height: 32
:width: 32
icon-delete
.. figure:: img/actions/delete-white.*
:height: 32
:width: 32
icon-delete-white
.. figure:: img/actions/details.*
:height: 32
:width: 32
icon-details
.. figure:: img/actions/download.*
:height: 32
:width: 32
icon-download
.. figure:: img/actions/download-white.*
:height: 32
:width: 32
icon-download-white
.. figure:: img/actions/edit.*
:height: 32
:width: 32
icon-edit
.. figure:: img/actions/error.*
:height: 32
:width: 32
icon-error
.. figure:: img/actions/error-color.*
:height: 32
:width: 32
icon-error-color
.. figure:: img/actions/error-white.*
:height: 32
:width: 32
icon-error-white
.. figure:: img/actions/external.*
:height: 32
:width: 32
icon-external
.. figure:: img/actions/star-dark.*
:height: 32
:width: 32
icon-favorite
.. figure:: img/filetypes/text.*
:height: 32
:width: 32
icon-file
.. figure:: img/places/files.*
:height: 32
:width: 32
icon-files
.. figure:: img/places/files-dark.*
:height: 32
:width: 32
icon-files-dark
.. figure:: img/filetypes/folder-drag-accept.*
:height: 32
:width: 32
icon-filetype-folder-drag-accept
.. figure:: img/filetypes/folder.*
:height: 32
:width: 32
icon-folder
.. figure:: img/actions/fullscreen.*
:height: 32
:width: 32
icon-fullscreen
.. figure:: img/actions/fullscreen-white.*
:height: 32
:width: 32
icon-fullscreen-white
.. figure:: img/actions/history.*
:height: 32
:width: 32
icon-history
.. figure:: img/places/home.*
:height: 32
:width: 32
icon-home
.. figure:: img/actions/info.*
:height: 32
:width: 32
icon-info
.. figure:: img/actions/info-white.*
:height: 32
:width: 32
icon-info-white
.. figure:: img/places/link.*
:height: 32
:width: 32
icon-link
.. figure:: img/actions/logout.*
:height: 32
:width: 32
icon-logout
.. figure:: img/actions/mail.*
:height: 32
:width: 32
icon-mail
.. figure:: img/actions/menu.*
:height: 32
:width: 32
icon-menu
.. figure:: img/actions/more.*
:height: 32
:width: 32
icon-more
.. figure:: img/actions/more-white.*
:height: 32
:width: 32
icon-more-white
.. figure:: img/places/music.*
:height: 32
:width: 32
icon-music
.. figure:: img/actions/password.*
:height: 32
:width: 32
icon-password
.. figure:: img/actions/pause.*
:height: 32
:width: 32
icon-pause
.. figure:: img/actions/pause-big.*
:height: 32
:width: 32
icon-pause-big
.. figure:: img/places/picture.*
:height: 32
:width: 32
icon-picture
.. figure:: img/actions/play.*
:height: 32
:width: 32
icon-play
.. figure:: img/actions/play-add.*
:height: 32
:width: 32
icon-play-add
.. figure:: img/actions/play-big.*
:height: 32
:width: 32
icon-play-big
.. figure:: img/actions/play-next.*
:height: 32
:width: 32
icon-play-next
.. figure:: img/actions/play-previous.*
:height: 32
:width: 32
icon-play-previous
.. figure:: img/actions/public.*
:height: 32
:width: 32
icon-public
.. figure:: img/actions/rename.*
:height: 32
:width: 32
icon-rename
.. figure:: img/actions/screen.*
:height: 32
:width: 32
icon-screen
.. figure:: img/actions/screen-off.*
:height: 32
:width: 32
icon-screen-off
.. figure:: img/actions/screen-off-white.*
:height: 32
:width: 32
icon-screen-off-white
.. figure:: img/actions/screen-white.*
:height: 32
:width: 32
icon-screen-white
.. figure:: img/actions/search.*
:height: 32
:width: 32
icon-search
.. figure:: img/actions/search-white.*
:height: 32
:width: 32
icon-search-white
.. figure:: img/actions/settings.*
:height: 32
:width: 32
icon-settings
.. figure:: img/actions/settings-dark.*
:height: 32
:width: 32
icon-settings-dark
.. figure:: img/actions/settings-white.*
:height: 32
:width: 32
icon-settings-white
.. figure:: img/actions/share.*
:height: 32
:width: 32
icon-share
.. figure:: img/actions/sound.*
:height: 32
:width: 32
icon-sound
.. figure:: img/actions/sound-off.*
:height: 32
:width: 32
icon-sound-off
.. figure:: img/actions/star.*
:height: 32
:width: 32
icon-star
.. figure:: img/actions/tag.*
:height: 32
:width: 32
icon-tag
.. figure:: img/actions/toggle.*
:height: 32
:width: 32
icon-toggle
.. figure:: img/actions/toggle-pictures.*
:height: 32
:width: 32
icon-toggle-pictures
.. figure:: img/actions/triangle-e.*
:height: 32
:width: 32
icon-triangle-e
.. figure:: img/actions/triangle-n.*
:height: 32
:width: 32
icon-triangle-n
.. figure:: img/actions/triangle-s.*
:height: 32
:width: 32
icon-triangle-s
.. figure:: img/actions/upload.*
:height: 32
:width: 32
icon-upload
.. figure:: img/actions/upload-white.*
:height: 32
:width: 32
icon-upload-white
.. figure:: img/actions/user.*
:height: 32
:width: 32
icon-user
.. figure:: img/actions/video.*
:height: 32
:width: 32
icon-video
.. figure:: img/actions/video-off.*
:height: 32
:width: 32
icon-video-off
.. figure:: img/actions/video-off-white.*
:height: 32
:width: 32
icon-video-off-white
.. figure:: img/actions/video-white.*
:height: 32
:width: 32
icon-video-white
.. figure:: img/actions/view-close.*
:height: 32
:width: 32
icon-view-close
.. figure:: img/actions/view-download.*
:height: 32
:width: 32
icon-view-download
.. figure:: img/actions/view-next.*
:height: 32
:width: 32
icon-view-next
.. figure:: img/actions/view-pause.*
:height: 32
:width: 32
icon-view-pause
.. figure:: img/actions/view-play.*
:height: 32
:width: 32
icon-view-play
.. figure:: img/actions/view-previous.*
:height: 32
:width: 32
icon-view-previous

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M9.02 13.98h-2v-5h-5v-2h5v-5h2v5l5-.028V8.98h-5z"/></svg>

After

Width:  |  Height:  |  Size: 129 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1" viewbox="0 0 16 16"><path d="m5.5 8 6 6v1l-7-7 7-7v1z"/></svg>

After

Width:  |  Height:  |  Size: 140 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1" viewbox="0 0 16 16"><path d="m10.5 8-6-6v-1l7 7-7 7v-1z"/></svg>

After

Width:  |  Height:  |  Size: 142 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 651 B

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1" viewBox="0 0 16 16">
<defs>
<filter id="a" style="color-interpolation-filters:sRGB" height="1.3148" width="1.4203" y="-.15742" x="-.21014">
<feGaussianBlur stdDeviation="0.91827834"/>
</filter>
</defs>
<path opacity=".5" d="m8 1c-1.108 0-2 0.892-2 2v4c0 0.0535 0.0115 0.1038 0.0156 0.1562l3.9844-3.9824v-0.1738c0-1.108-0.892-2-2-2zm4.486 1.5137c-0.127 0-0.256 0.0233-0.377 0.0722-0.119 0.0488-0.232 0.1232-0.33 0.2207l-8.486 8.4844c-0.1959 0.196-0.293 0.453-0.293 0.709s0.0971 0.511 0.293 0.707c0.1958 0.196 0.4509 0.293 0.707 0.293s0.5131-0.097 0.709-0.293l8.484-8.4863c0.098-0.0975 0.172-0.2103 0.221-0.3301v-0.0019c0.147-0.361 0.073-0.7883-0.221-1.0821-0.196-0.1958-0.451-0.2929-0.707-0.2929zm-8.486 2.4863c-0.554 0-1 0.446-1 1v1a4.988 4.988 0 0 0 0.6719 2.5l1.5078-1.5078c-0.1093-0.3119-0.1797-0.6421-0.1797-0.9922v-1c0-0.554-0.446-1-1-1zm8.973 0.8594l-2.161 2.1582c-0.301 0.8367-0.9577 1.4934-1.7944 1.7949l-2.0742 2.0745a4.988 4.988 0 0 0 0.0566 0.013v1.1h-1.1699l-0.4141 0.414c-0.125 0.125-0.2683 0.222-0.416 0.307v1.279h6v-2h-2v-1.1c2.287-0.46 4-2.473 4-4.9v-1c0-0.0498-0.02-0.0928-0.027-0.1406z" filter="url(#a)"/>
<path fill="#fff" d="m8 1c-1.108 0-2 0.892-2 2v4c0 0.0535 0.0115 0.1038 0.0156 0.1562l3.9844-3.9824v-0.1738c0-1.108-0.892-2-2-2zm4.486 1.5137c-0.127 0-0.256 0.0233-0.377 0.0722-0.119 0.0488-0.232 0.1232-0.33 0.2207l-8.486 8.4844c-0.1959 0.196-0.293 0.453-0.293 0.709s0.0971 0.511 0.293 0.707c0.1958 0.196 0.4509 0.293 0.707 0.293s0.5131-0.097 0.709-0.293l8.484-8.4863c0.098-0.0975 0.172-0.2103 0.221-0.3301v-0.0019c0.147-0.361 0.073-0.7883-0.221-1.0821-0.196-0.1958-0.451-0.2929-0.707-0.2929zm-8.486 2.4863c-0.554 0-1 0.446-1 1v1a4.988 4.988 0 0 0 0.6719 2.5l1.5078-1.5078c-0.1093-0.3119-0.1797-0.6421-0.1797-0.9922v-1c0-0.554-0.446-1-1-1zm8.973 0.8594l-2.161 2.1582c-0.301 0.8367-0.9577 1.4934-1.7944 1.7949l-2.0742 2.0745a4.988 4.988 0 0 0 0.0566 0.013v1.1h-1.1699l-0.4141 0.414c-0.125 0.125-0.2683 0.222-0.416 0.307v1.279h6v-2h-2v-1.1c2.287-0.46 4-2.473 4-4.9v-1c0-0.0498-0.02-0.0928-0.027-0.1406z"/>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 328 B

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1" viewBox="0 0 16 16">
<path d="m8 1c-1.108 0-2 0.892-2 2v4c0 0.0535 0.0115 0.1038 0.0156 0.1562l3.9844-3.9824v-0.1738c0-1.108-0.892-2-2-2zm4.486 1.5137c-0.127 0-0.256 0.0233-0.377 0.0722-0.119 0.0488-0.232 0.1232-0.33 0.2207l-8.486 8.4844c-0.1959 0.196-0.293 0.453-0.293 0.709s0.0971 0.511 0.293 0.707c0.1958 0.196 0.4509 0.293 0.707 0.293s0.5131-0.097 0.709-0.293l8.484-8.4863c0.098-0.0975 0.172-0.2103 0.221-0.3301v-0.0019c0.147-0.361 0.073-0.7883-0.221-1.0821-0.196-0.1958-0.451-0.2929-0.707-0.2929zm-8.486 2.4863c-0.554 0-1 0.446-1 1v1a4.988 4.988 0 0 0 0.6719 2.5l1.5078-1.5078c-0.1093-0.3119-0.1797-0.6421-0.1797-0.9922v-1c0-0.554-0.446-1-1-1zm8.973 0.8594l-2.161 2.1582c-0.301 0.8367-0.9577 1.4934-1.7944 1.7949l-2.0742 2.0745a4.988 4.988 0 0 0 0.0566 0.013v1.1h-1.1699l-0.4141 0.414c-0.125 0.125-0.2683 0.222-0.416 0.307v1.279h6v-2h-2v-1.1c2.287-0.46 4-2.473 4-4.9v-1c0-0.0498-0.02-0.0928-0.027-0.1406z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 534 B

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1" viewBox="0 0 16 16">
<defs>
<filter id="a" style="color-interpolation-filters:sRGB" height="1.3086" width="1.432" y="-.15429" x="-0.216">
<feGaussianBlur stdDeviation="0.90000044"/>
</filter>
</defs>
<path opacity=".5" d="m8 1c-1.108 0-2 0.892-2 2v4c0 1.108 0.892 2 2 2s2-0.892 2-2v-4c0-1.108-0.892-2-2-2zm-4 4c-0.554 0-1 0.446-1 1v1a4.988 4.988 0 0 0 4 4.9v1.1h-2v2h6v-2h-2v-1.1c2.287-0.46 4-2.473 4-4.9v-1c0-0.554-0.446-1-1-1s-1 0.446-1 1v1c0 1.662-1.338 3-3 3s-3-1.338-3-3v-1c0-0.554-0.446-1-1-1z" fill-rule="evenodd" filter="url(#a)"/>
<path fill="#fff" d="m8 1c-1.108 0-2 0.892-2 2v4c0 1.108 0.892 2 2 2s2-0.892 2-2v-4c0-1.108-0.892-2-2-2zm-4 4c-0.554 0-1 0.446-1 1v1a4.988 4.988 0 0 0 4 4.9v1.1h-2v2h6v-2h-2v-1.1c2.287-0.46 4-2.473 4-4.9v-1c0-0.554-0.446-1-1-1s-1 0.446-1 1v1c0 1.662-1.338 3-3 3s-3-1.338-3-3v-1c0-0.554-0.446-1-1-1z" fill-rule="evenodd"/>
</svg>

After

Width:  |  Height:  |  Size: 1012 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 305 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" viewBox="0 0 16 16"><path d="M8 1c-1.108 0-2 .892-2 2v4c0 1.108.892 2 2 2s2-.892 2-2V3c0-1.108-.892-2-2-2zM4 5c-.554 0-1 .446-1 1v1a4.988 4.988 0 0 0 4 4.9V13H5v2h6v-2H9v-1.1c2.287-.46 4-2.473 4-4.9V6c0-.554-.446-1-1-1s-1 .446-1 1v1c0 1.662-1.338 3-3 3S5 8.662 5 7V6c0-.554-.446-1-1-1z" fill-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 378 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1"><path style="block-progression:tb;text-transform:none;text-indent:0" d="M4 6l4 4 4-3.994z" color="#000"/></svg>

After

Width:  |  Height:  |  Size: 186 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="10" width="10" version="1"><path style="block-progression:tb;text-transform:none;text-indent:0" d="M1 3l4 4 4-3.994z" fill="#fff" color="#000"/></svg>

After

Width:  |  Height:  |  Size: 198 B

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="16" height="16" version="1.1" xmlns="http://www.w3.org/2000/svg">
<path d="m0 0v16h16v-16h-16zm11.924 4.0664l1.4336 1.4297-6.3652 6.3652-4.2422-4.2441 1.4141-1.4121 2.8281 2.8301 4.9316-4.9688z" fill="#fff"/>
</svg>

After

Width:  |  Height:  |  Size: 268 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M11.924 4.066l-4.932 4.97-2.828-2.83L2.75 7.618l4.242 4.243 6.365-6.365-1.433-1.432z" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 177 B

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="16" height="16" version="1.1" xmlns="http://www.w3.org/2000/svg">
<path d="m0 0v16h16v-16h-16zm4 7h8v2h-8v-2z" fill="#fff"/>
</svg>

After

Width:  |  Height:  |  Size: 184 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M4 7v2h8V7H4z" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 106 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 343 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="16" viewBox="-0.5 -0.5 16 16" width="16" overflow="visible"><path d="M6.09 12.5L1.14 7.55l1.413-1.414L6.09 9.67l6.344-6.382 1.433 1.434z" fill="#00d400"/></svg>

After

Width:  |  Height:  |  Size: 208 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 258 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="16" viewBox="-0.5 -0.5 16 16" width="16" overflow="visible"><path d="M6.09 12.5L1.14 7.55l1.413-1.414L6.09 9.67l6.345-6.382 1.433 1.434z" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 205 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 260 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="16" viewBox="-0.5 -0.5 16 16" width="16" overflow="visible"><path d="M6.09 12.5L1.14 7.55l1.413-1.414L6.09 9.67l6.344-6.382 1.433 1.434z"/></svg>

After

Width:  |  Height:  |  Size: 193 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 B

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1" viewBox="0 0 16 16">
<path opacity=".5" d="m13 15h-11l0.0005-10h11v3.0002l1-0.0004 0.0005-5.0001c0.000058-0.5834-0.4165-1.0002-1.0005-1.0001l-3.467 0.0005c0.0008-1.183-0.9492-2.0001-2.1325-2.0001s-2.1333 0.8171-2.1333 2.0004h-3.2c-0.5834 0-1.0662 0.4166-1.0662 0.9999l-0.0005 12c-0.0000243 0.584 0.4833 1 1.0667 1l10.933-0.0005c0.584-0.001 1-0.416 1-1v-3h-1zm-8.8005-12h1.0672c0.5833 0 1.0666-0.4162 1.0666-0.9996 0-0.5833 0.4834-0.9337 1.0667-0.9337s1.0667 0.3504 1.0667 0.9337c0 0.5834 0.5333 0.9996 1.0666 0.9996h1.2667c0.517 0 1.2 0.4166 1.2 1h-9c-0.0004-0.65 0.5988-1 1.1988-1zm-1.1995 8h2v-1h-2zm7.9998-2v-2l-4 3 3.9998 3v-2l5.0002-0.00005v-2l-4.9998-0.00005zm-8 4h4v-1h-4zm6-7h-6v1h6zm-3 2h-3v1h3z"/>
</svg>

After

Width:  |  Height:  |  Size: 848 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 B

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1">
<path fill="#fff" d="m12.95 11.536l-1.414 1.414-3.536-3.536-3.535 3.536-1.415-1.414 3.536-3.536-3.536-3.536 1.415-1.414 3.535 3.536 3.516-3.555 1.434 1.434-3.536 3.535z"/>
</svg>

After

Width:  |  Height:  |  Size: 313 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 B

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1">
<path d="m12.95 11.536l-1.414 1.414-3.536-3.536-3.535 3.536-1.415-1.414 3.536-3.536-3.536-3.536 1.415-1.414 3.535 3.536 3.516-3.555 1.434 1.434-3.536 3.535z"/>
</svg>

After

Width:  |  Height:  |  Size: 301 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 323 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" viewbox="0 0 16 16"><path d="M8 1.5C3.582 1.5 0 3.962 0 7s3.582 5.5 8 5.5c.25 0 .49-.016.734-.03L13 16v-4.703c1.83-1.008 3-2.56 3-4.297 0-3.038-3.582-5.5-8-5.5z"/></svg>

After

Width:  |  Height:  |  Size: 233 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 244 B

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1">
<path d="m8.6328 0.63477c-0.2556 0-0.5112 0.0971-0.707 0.29296-0.3918 0.39177-0.3918 1.0224 0 1.4141l4.6582 4.6582h-11.584c-0.554 0-1 0.446-1 1s0.446 1 1 1h11.586l-4.6583 4.658c-0.3917 0.392-0.3917 1.023 0 1.414 0.3918 0.392 1.0224 0.392 1.4141 0l6.3632-6.363v-0.002h0.002c0.093-0.093 0.166-0.2041 0.217-0.3281l0.002-0.0019v-0.002c0.02-0.0508 0.019-0.1053 0.031-0.1582 0.016-0.0718 0.043-0.14 0.043-0.2168 0-0.0714-0.027-0.1341-0.041-0.2012-0.012-0.0578-0.012-0.1202-0.033-0.1738v-0.002c-0.001-0.0013-0.002-0.0026-0.002-0.0039-0.051-0.1233-0.124-0.2335-0.217-0.3261-0.001-0.0007-0.001-0.0013-0.002-0.002l-6.3632-6.3633c-0.1959-0.19583-0.4534-0.29293-0.709-0.29293z" fill-rule="evenodd" fill="#fff"/>
</svg>

After

Width:  |  Height:  |  Size: 841 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 B

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1" viewBox="0 0 16 16">
<path d="m8.6328 0.63477c-0.2556 0-0.5112 0.0971-0.707 0.29296-0.3918 0.39177-0.3918 1.0224 0 1.4141l4.6582 4.6582h-11.584c-0.554 0-1 0.446-1 1s0.446 1 1 1h11.586l-4.6583 4.658c-0.3917 0.392-0.3917 1.023 0 1.414 0.3918 0.392 1.0224 0.392 1.4141 0l6.3632-6.363v-0.002h0.002c0.093-0.093 0.166-0.2041 0.217-0.3281l0.002-0.0019v-0.002c0.02-0.0508 0.019-0.1053 0.031-0.1582 0.016-0.0718 0.043-0.14 0.043-0.2168 0-0.0714-0.027-0.1341-0.041-0.2012-0.012-0.0578-0.012-0.1202-0.033-0.1738v-0.002c-0.001-0.0013-0.002-0.0026-0.002-0.0039-0.051-0.1233-0.124-0.2335-0.217-0.3261-0.001-0.0007-0.001-0.0013-0.002-0.002l-6.3632-6.3633c-0.1959-0.19583-0.4534-0.29293-0.709-0.29293z" fill-rule="evenodd"/>
</svg>

After

Width:  |  Height:  |  Size: 849 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path fill="#d40000" d="M6.5 1L6 2H3c-.554 0-1 .446-1 1v1h12V3c0-.554-.446-1-1-1h-3l-.5-1zM3 5l.875 9c.06.55.573 1 1.125 1h6c.552 0 1.064-.45 1.125-1L13 5z" fill-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 247 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M6.5 1L6 2H3c-.554 0-1 .446-1 1v1h12V3c0-.554-.446-1-1-1h-3l-.5-1zM3 5l.875 9c.06.55.573 1 1.125 1h6c.552 0 1.064-.45 1.125-1L13 5z" fill-rule="evenodd" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 244 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M6.5 1L6 2H3c-.554 0-1 .446-1 1v1h12V3c0-.554-.446-1-1-1h-3l-.5-1zM3 5l.875 9c.06.55.573 1 1.125 1h6c.552 0 1.064-.45 1.125-1L13 5z" fill-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 232 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1"><path d="M5 7.474c.155.382.325.69.644.246.407-.268 1.76-1.427 1.662-.342-.368 2.017-.834 4.017-1.17 6.04-.393 1.114.634 2.067 1.637 1.31 1.078-.502 1.99-1.287 2.927-2.01-.144-.323-.25-.79-.596-.347-.468.24-1.47 1.318-1.696.472.315-2.18.975-4.295 1.365-6.462.397-1.005-.364-2.223-1.4-1.363C7.117 5.634 6.083 6.6 5 7.474zM9.46.005C8.15-.017 7.553 2.147 8.815 2.68c1.023.378 2.077-.714 1.79-1.75-.098-.542-.598-.97-1.147-.93z"/></svg>

After

Width:  |  Height:  |  Size: 506 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 211 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path fill="#fff" d="M6 1h4v7h5l-7 7-7-7h5z"/></svg>

After

Width:  |  Height:  |  Size: 115 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 213 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M6 1h4v7h5l-7 7-7-7h5z"/></svg>

After

Width:  |  Height:  |  Size: 103 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 233 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1"><path style="block-progression:tb;text-transform:none;text-indent:0" d="M2.35 1.002A.45.45 0 0 0 2 1.44V14.56c0 .232.206.44.432.44H13.57a.452.452 0 0 0 .432-.438V4.42a.458.458 0 0 0-.055-.192l-3.312-3.2a.427.427 0 0 0-.135-.026H2.43a.424.424 0 0 0-.08 0zM4 3h6v1H4V3zm0 3h5v1H4V6zm0 3h8v1H4V9zm0 3h4v1H4v-1z" color="#000"/></svg>

After

Width:  |  Height:  |  Size: 404 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 271 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M5.516 2L2 5.516v4.968L5.516 14h4.968L14 10.484V5.516L10.484 2H5.516zM7 4h2v5H7V4zm0 6h2v2H7v-2z" fill="#d40000"/></svg>

After

Width:  |  Height:  |  Size: 192 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M5.516 2L2 5.516v4.968L5.516 14h4.968L14 10.484V5.516L10.484 2H5.516zM7 4h2v5H7V4zm0 6h2v2H7v-2z" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 189 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M5.516 2L2 5.516v4.968L5.516 14h4.968L14 10.484V5.516L10.484 2H5.516zM7 4h2v5H7V4zm0 6h2v2H7v-2z"/></svg>

After

Width:  |  Height:  |  Size: 177 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 348 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M7.452 1.62l2.38 2.256-3.57 3.386L8.64 9.52l3.57-3.387 2.38 2.257V1.618h-7.14zM2.69 2.746c-.66 0-1.19.504-1.19 1.13v9.028c0 .625.53 1.128 1.19 1.128h9.522c.66 0 1.19-.503 1.19-1.128V9.52l-1.19-1.13v4.515h-9.52v-9.03h4.76l-1.19-1.128H2.69z"/></svg>

After

Width:  |  Height:  |  Size: 319 B

Some files were not shown because too many files have changed in this diff Show More