├── .editorconfig ├── .gitattributes ├── .gitignore ├── .htaccess ├── .travis.yml ├── Gruntfile.js ├── LICENSE ├── README.md ├── bin └── compile ├── compile.sh ├── composer.json ├── composer.lock ├── daux.phar ├── daux └── Processor.php ├── deploy.sh ├── docs ├── 00_User_Manual │ ├── 00_Quick_Start_Guide.md │ ├── 01_First_steps_with_Volumio.md │ ├── 02_More_first_steps.md │ ├── 03_System_updates.md │ ├── 04_Volume_Control_and_audio_quality.md │ ├── 05_Stream_audio_to_volumio.md │ ├── 06_SSH.md │ ├── 07_Configure_MPD_Clients_for_albumart.md │ ├── 08_Sending_logs_for_troubleshooting.md │ ├── 09_Other_Customizations.md │ └── img │ │ ├── browse_page.png │ │ ├── desktop-main-page.jpg │ │ ├── helper-eighth-screen.png │ │ ├── helper-fifth-screen.png │ │ ├── helper-first-screen.png │ │ ├── helper-fourth-screen.png │ │ ├── helper-second-screen.png │ │ ├── helper-seventh-screen.png │ │ ├── helper-sixth-screen.png │ │ ├── helper-third-screen.png │ │ ├── log_ssh.png │ │ ├── main-page-descr.jpg │ │ ├── mobile-main-page.png │ │ ├── music_library.png │ │ ├── music_library_add_radio.jpg │ │ ├── music_library_add_url.png │ │ ├── music_library_albums.jpg │ │ ├── music_library_artists.jpg │ │ ├── music_library_artists_meta.jpg │ │ ├── music_library_genres.png │ │ ├── music_library_radio.jpg │ │ ├── send_log.png │ │ ├── send_log2.png │ │ ├── settings-main.jpg │ │ ├── ssh_enable.png │ │ ├── test_mode_enable.png │ │ └── update_ota.jpg ├── 01_Development_How_To │ ├── 00_Overview.md │ ├── 01_System_Architecture.md │ ├── 02_Set_up_development_environment_introduction.md │ ├── 03_Set_up_development_environment_for_backend.md │ ├── 04_Set_up_development_environment_for_UI.md │ ├── 05_Set_up_development_environment_for_Volumio_images.md │ ├── 06_Updating_source_files.md │ ├── 07_Debugging.md │ ├── 08_Helping_the_project.md │ └── img │ │ └── architecture.png ├── 02_API │ ├── 01_API_Overview.md │ ├── 02_WebSocket_APIs.md │ ├── 03_UI_Configuration_Pages.md │ ├── 04_REST_API.md │ └── 05_Command_Line_Client.md ├── 03_Plugin_System │ ├── 01_Plugin_System_Overview.md │ ├── 02_Writing_A_Plugin.md │ ├── 03_Index.js.md │ ├── 04_UI_Configuration_Pages.md │ ├── 05_Toast_Messages.md │ ├── 06_Logging.md │ ├── 07_User_Modal.md │ ├── 08_Music_Service_Plugin.md │ ├── 09_Custom_ALSA_Contributions.md │ └── img │ │ ├── plugin_enable.png │ │ ├── plugin_list.png │ │ └── plugin_menu.png ├── 04_I2S_DACs │ └── 01_Adding_Compatibility_to_your_DAC.md ├── 05_Porting_Guide │ ├── 01_Introduction.md │ ├── 02_What_Is_Needed_To_Port_Successfully.md │ ├── 03_Preparing_The_Build_Environment.md │ ├── 04_Example │ ├── 05_The_Process.md │ ├── 06_The_Platform_Folder.md │ ├── 07_Compiling_U-Boot.md │ ├── 08_Get_The_Kernel_Source.md │ ├── 09_Configure_Kernel_Options.md │ ├── 09_Get_The_Kernel_Source.md │ ├── 10_Compiling_The_Kernel.md │ ├── 10_Configure_Kernel_Options.md │ ├── 11_Compiling_The_Kernel.md │ ├── 12_Boot_Parameters.md │ ├── 14_Saving_Files_To_The_Platform_Folder.md │ ├── 15_A_Complete_Script.md │ ├── 17_1_How_To_Build_A_Sparky.md │ ├── 17_Creating_the_image.md │ ├── 18_Creating_the_image_build_scripts (Part 1).md │ ├── 19_Creating_the_image_build_scripts (Part 2).md │ ├── 20_Boot_Parameters.md │ └── img │ │ └── uart-intfc.jpg ├── 06_Plugins_User_Manuals │ ├── 00_brutefir │ │ ├── 00_Drc_with_Volumio.md │ │ ├── 01_Preparing_your_system.md │ │ ├── 02_Making_Measurment.md │ │ ├── 03_Making_filters.md │ │ ├── 04_Using_filters_in_Volumio.md │ │ └── img │ │ │ ├── VoBAF-settings.png │ │ │ ├── export_impulse.jpg │ │ │ ├── filter-creation-menu.png │ │ │ ├── first_filter.png │ │ │ ├── general_plugin_settings.png │ │ │ ├── install_tools.png │ │ │ ├── list_sweep_files.png │ │ │ ├── make_a_measurment.jpg │ │ │ ├── preferences_micmeter.jpg │ │ │ ├── rePhase_import.jpg │ │ │ ├── rephase_import_REW_filter_settings.jpg │ │ │ ├── rew1.png │ │ │ ├── rew_EQ_window.jpg │ │ │ ├── rew_preferences.jpg │ │ │ ├── rew_rta_settings.png │ │ │ ├── room-settings.png │ │ │ ├── room_settings_values.png │ │ │ ├── select_filter.png │ │ │ ├── sofa_front.png │ │ │ ├── sofa_iso.png │ │ │ ├── sofa_top.png │ │ │ └── using_filter_in_volumio.png │ └── 01_rotaryencoder2 │ │ ├── 00_Rotary_Encoder_II.md │ │ ├── 01_Debouncing.md │ │ ├── 02_Device_Tree_Overlays.md │ │ ├── 03_Compatible_Encoders.md │ │ ├── 04_Appendix.md │ │ └── img │ │ ├── RC-Schmitt.jpg │ │ ├── RC-debounced.jpg │ │ ├── RC-debounced2.jpg │ │ ├── RC-filter.jpg │ │ ├── Schmitt-Trigger.jpg │ │ ├── Schmitt-Trigger2.jpg │ │ ├── bouncy_rotary.jpg │ │ ├── rotary_types.jpg │ │ ├── settings_en.jpg │ │ ├── settings_en.pxm │ │ ├── tau_charge.jpg │ │ └── tau_discharge.jpg ├── 07_Good_to_Knows │ ├── 01_Markdown_Cheatsheet.md │ ├── 02_Mounting_an_NFS_Share.md │ ├── 03_Contribute_to_this_Doc.md │ ├── 04_Connection_Outside_LAN.md │ └── 05_Finding_Volumio.md ├── 08_FAQs │ ├── 00_General.md │ ├── 01_Installation.md │ ├── 02_Updating_and_Maintenance.md │ ├── 03_Audio_Sources.md │ ├── 04_Audio_Output.md │ └── img │ │ ├── audio-output.jpg │ │ ├── cifs_options.jpg │ │ └── multiroom.png ├── _index.md └── config.json ├── generate ├── global.json ├── gulpfile.js ├── index.php ├── libs ├── Compiler.php ├── Config.php ├── Console │ ├── Application.php │ ├── Generate.php │ └── RunAction.php ├── ContentTypes │ ├── ContentType.php │ ├── ContentTypeHandler.php │ └── Markdown │ │ ├── CommonMarkConverter.php │ │ ├── ContentType.php │ │ ├── LinkRenderer.php │ │ ├── TableOfContents.php │ │ └── TableOfContentsParser.php ├── Daux.php ├── DauxHelper.php ├── Exception.php ├── Format │ ├── Base │ │ ├── ComputedRawPage.php │ │ ├── ContentPage.php │ │ ├── EmbedImages.php │ │ ├── Generator.php │ │ ├── LiveGenerator.php │ │ ├── Page.php │ │ ├── RawPage.php │ │ └── SimplePage.php │ ├── Confluence │ │ ├── Api.php │ │ ├── ContentPage.php │ │ ├── ContentTypes │ │ │ └── Markdown │ │ │ │ ├── CommonMarkConverter.php │ │ │ │ ├── ContentType.php │ │ │ │ ├── FencedCodeRenderer.php │ │ │ │ ├── ImageRenderer.php │ │ │ │ ├── IndentedCodeRenderer.php │ │ │ │ ├── LinkRenderer.php │ │ │ │ └── TOCRenderer.php │ │ ├── DuplicateTitleException.php │ │ ├── Generator.php │ │ └── Publisher.php │ ├── HTML │ │ ├── ComputedRawPage.php │ │ ├── ContentPage.php │ │ ├── ContentTypes │ │ │ └── Markdown │ │ │ │ ├── CommonMarkConverter.php │ │ │ │ ├── ContentType.php │ │ │ │ └── TOC │ │ │ │ ├── Entry.php │ │ │ │ ├── Processor.php │ │ │ │ ├── Renderer.php │ │ │ │ └── RootEntry.php │ │ ├── Generator.php │ │ ├── RawPage.php │ │ ├── SimplePage.php │ │ └── Template.php │ └── HTMLFile │ │ ├── Book.php │ │ ├── ContentPage.php │ │ └── Generator.php ├── GeneratorHelper.php ├── Processor.php ├── Server │ ├── ErrorPage.php │ ├── MimeType.php │ ├── NotFoundException.php │ └── Server.php └── Tree │ ├── Builder.php │ ├── ComputedRaw.php │ ├── Content.php │ ├── Directory.php │ ├── Entry.php │ ├── Raw.php │ └── Root.php ├── logb ├── logu ├── package.json ├── phpunit.xml ├── serve ├── templates ├── content.php ├── error.php ├── home.php ├── layout │ ├── 00_layout.php │ └── 05_page.php └── partials │ ├── google_analytics.php │ ├── navbar_content.php │ └── piwik_analytics.php ├── tests ├── Format │ └── Confluence │ │ └── ApiTest.php └── Tree │ ├── BuilderTest.php │ ├── ContentTest.php │ └── DirectoryTest.php ├── themes ├── common │ └── less │ │ └── _typography.less ├── daux │ ├── config.json │ ├── css │ │ ├── theme.min.css │ │ └── volumiodocs.min.css │ ├── fonts │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.svg │ │ ├── glyphicons-halflings-regular.ttf │ │ ├── glyphicons-halflings-regular.woff │ │ └── glyphicons-halflings-regular.woff2 │ ├── img │ │ └── favicon.png │ ├── js │ │ ├── daux.js │ │ ├── highlight.pack.js │ │ └── jquery-1.11.3.min.js │ └── less │ │ ├── _components.less │ │ ├── _mixins.less │ │ ├── _structure.less │ │ ├── _typography.less │ │ ├── theme-base.less │ │ ├── theme-blue.less │ │ ├── theme-green.less │ │ ├── theme-navy.less │ │ ├── theme-red.less │ │ ├── theme.less │ │ └── vendor │ │ ├── bootstrap │ │ ├── alerts.less │ │ ├── badges.less │ │ ├── bootstrap.less │ │ ├── breadcrumbs.less │ │ ├── button-groups.less │ │ ├── buttons.less │ │ ├── carousel.less │ │ ├── close.less │ │ ├── code.less │ │ ├── component-animations.less │ │ ├── dropdowns.less │ │ ├── forms.less │ │ ├── glyphicons.less │ │ ├── grid.less │ │ ├── input-groups.less │ │ ├── jumbotron.less │ │ ├── labels.less │ │ ├── list-group.less │ │ ├── media.less │ │ ├── mixins.less │ │ ├── mixins │ │ │ ├── alerts.less │ │ │ ├── background-variant.less │ │ │ ├── border-radius.less │ │ │ ├── buttons.less │ │ │ ├── center-block.less │ │ │ ├── clearfix.less │ │ │ ├── forms.less │ │ │ ├── gradients.less │ │ │ ├── grid-framework.less │ │ │ ├── grid.less │ │ │ ├── hide-text.less │ │ │ ├── image.less │ │ │ ├── labels.less │ │ │ ├── list-group.less │ │ │ ├── nav-divider.less │ │ │ ├── nav-vertical-align.less │ │ │ ├── opacity.less │ │ │ ├── pagination.less │ │ │ ├── panels.less │ │ │ ├── progress-bar.less │ │ │ ├── reset-filter.less │ │ │ ├── reset-text.less │ │ │ ├── resize.less │ │ │ ├── responsive-visibility.less │ │ │ ├── size.less │ │ │ ├── tab-focus.less │ │ │ ├── table-row.less │ │ │ ├── text-emphasis.less │ │ │ ├── text-overflow.less │ │ │ └── vendor-prefixes.less │ │ ├── modals.less │ │ ├── navbar.less │ │ ├── navs.less │ │ ├── normalize.less │ │ ├── pager.less │ │ ├── pagination.less │ │ ├── panels.less │ │ ├── popovers.less │ │ ├── print.less │ │ ├── progress-bars.less │ │ ├── responsive-embed.less │ │ ├── responsive-utilities.less │ │ ├── scaffolding.less │ │ ├── tables.less │ │ ├── theme.less │ │ ├── thumbnails.less │ │ ├── tooltip.less │ │ ├── type.less │ │ ├── utilities.less │ │ ├── variables.less │ │ └── wells.less │ │ └── highlight.less └── daux_singlepage │ ├── css │ └── main.min.css │ └── less │ ├── fonts.less │ ├── main.less │ ├── print.less │ ├── typography.less │ ├── variables.less │ └── vendor │ ├── bootstrap │ ├── normalize.less │ ├── scaffolding.less │ ├── type.less │ └── variables.less │ └── highlight.less └── tipuesearch ├── tipuesearch.css ├── tipuesearch.min.js └── tipuesearch_set.js /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 4 7 | end_of_line = lf 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | 11 | [*.{rb,sh,md,yaml},package.json] 12 | indent_size = 2 13 | 14 | [*.md] 15 | trim_trailing_whitespace = false 16 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | .idea 4 | /sftp-config.json 5 | static 6 | npm-debug.log 7 | 8 | /vendor 9 | -------------------------------------------------------------------------------- /.htaccess: -------------------------------------------------------------------------------- 1 | RewriteEngine On 2 | #RewriteBase / 3 | 4 | RewriteCond %{REQUEST_FILENAME} !-f 5 | RewriteCond %{REQUEST_FILENAME} !-d 6 | RewriteRule . index.php [L,QSA] 7 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | dist: trusty 2 | language: php 3 | if: "branch = master" 4 | script: bash ./deploy.sh 5 | env: 6 | global: 7 | - GH_REF: github.com/volumio/docs.git 8 | - secure: joyLlj0ztDTM9fJf6G/8OV2vHynRFWKZDUEVMY1KFS3mfvffDEQUWV3CvtpsDMTzD5uExrQfC8MYE86tIpnC+glcsd2FDZ93PFvZQqwwrJuVexo82FvKyijLSYRGzMZL0AZrtek+Ds6bO8uIkgr6d1ta7/grPItJ914bdpyBow9zwsB6puWq9liDEvJH0ajmSCn6CYv+JiZneDBnJCzZoBBplEfKaGw80E6KnFyhQIyfJ7hP4VT221fympn4ztU64LdtKeYArAXwiTKdCHkEuPtTgTBfDq88nRPyFwD8umbN9eSgrFfLLqBTKgB5MiT1atMJAAaLdiCTlRT4B59BuHATJIN1hWgJ6rhmNtRxCZbWjd8rlc98H8ryfdwgfrLFLfQfgq/em6dQ7NwRrqz+nCeCzn9wa1KXXTiUulEKDJTEUhVmUugCB+liSklOnUi4MMtRpnS402iXSsmqpYKO4I+TSq4g/ElfdcfiNCoRalEpXONEHRhEHK182iVELWII4shN/PlQWb84gxy4pN0p0y+XQjvSSq+bTcKkKlhMZk0DTkIke34INzs6dw+gJ7COb9+lPmig2U/8wXfhee+fRU8UcLbdqkVLf5KxBkzr4Y/3W5x971KHABOqUXi2KbzhEWqwsIol0U22P6/QhdgqH7jd8nXS4wrSJBSVMMe0A2s= 9 | php: 10 | - 5.5 11 | -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | module.exports = function (grunt) { 2 | 'use strict'; 3 | 4 | grunt.loadNpmTasks('grunt-php'); 5 | 6 | grunt.initConfig({ 7 | php: { 8 | dist: { 9 | options: { 10 | keepalive: true, 11 | open: true, 12 | port: 8085, 13 | router: "index.php" 14 | } 15 | } 16 | } 17 | }); 18 | 19 | grunt.registerTask('default', ['php']); 20 | }; 21 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2013 Justin Walsh (http://todaymade.com) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### THIS DOCUMENTATION PROJECT IS NOW DEPRECATED!!!! 2 | 3 | Volumio's developer's documentation has now moved to 4 | 5 | 6 | https://github.com/volumio/volumio-developers-docs 7 | 8 | 9 | And it's publicly accessible from: 10 | 11 | 12 | https://developers.volumio.com 13 | 14 | User's documentation is accessible from 15 | 16 | 17 | https://help.volumio.com 18 | -------------------------------------------------------------------------------- /bin/compile: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | compile(); 14 | } catch (\Exception $e) { 15 | echo 'Failed to compile phar: ['.get_class($e).'] '.$e->getMessage().' at '.$e->getFile().':'.$e->getLine(); 16 | exit(1); 17 | } 18 | -------------------------------------------------------------------------------- /compile.sh: -------------------------------------------------------------------------------- 1 | #/bin/sh 2 | 3 | php generate.php global.json out 4 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "justinwalsh/daux.io", 3 | "type": "project", 4 | "license": "MIT", 5 | "description": "Documentation generator that uses a simple folder structure and Markdown files to create custom documentation on the fly", 6 | "keywords": ["documentation", "docs", "markdown", "md"], 7 | "homepage": "http://daux.io/", 8 | "authors": [ 9 | { 10 | "name": "Justin Walsh", 11 | "homepage": "http://todaymade.com/" 12 | } 13 | ], 14 | "require": { 15 | "php": ">=5.4", 16 | "league/plates": "~3.1", 17 | "guzzlehttp/guzzle": "~6.0", 18 | "league/commonmark": "^0.13", 19 | "symfony/console": "~3.0", 20 | "symfony/finder": "~3.0", 21 | "webuni/commonmark-table-extension": "0.4.*", 22 | "myclabs/deep-copy": "^1.5" 23 | }, 24 | "autoload": { 25 | "psr-4": { 26 | "Todaymade\\Daux\\Extension\\": "daux/", 27 | "Todaymade\\Daux\\": "libs/" 28 | } 29 | }, 30 | "require-dev": { 31 | "phpunit/phpunit": "~4" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /daux.phar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/daux.phar -------------------------------------------------------------------------------- /daux/Processor.php: -------------------------------------------------------------------------------- 1 | dump()); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /deploy.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e # exit with nonzero exit code if anything fails 3 | 4 | # Compile the static docs 5 | ./daux.phar 6 | 7 | # go to the out directory and create a *new* Git repo 8 | cd static 9 | git init 10 | 11 | # inside this git repo we'll pretend to be a new user 12 | git config user.name "Travis CI" 13 | git config user.email "info@volumio.org" 14 | 15 | # The first and only commit to this new Git repo contains all the 16 | # files present with the commit message "Deploy to GitHub Pages". 17 | git add . 18 | git commit -m "Deploy to GitHub Pages" 19 | 20 | # Force push from the current repo's master branch to the remote 21 | # repo's gh-pages branch. (All previous history on the gh-pages branch 22 | # will be lost, since we are overwriting it.) We redirect any output to 23 | # /dev/null to hide any sensitive credential data that might otherwise be exposed. 24 | echo "Deploying" 25 | git push --force --quiet "https://${GH_TOKEN}@${GH_REF}" master:gh-pages > /dev/null 2>&1 26 | #git push --force --quiet "https://${GH_TOKEN}@${GH_REF}" master:gh-pages 27 | -------------------------------------------------------------------------------- /docs/00_User_Manual/04_Volume_Control_and_audio_quality.md: -------------------------------------------------------------------------------- 1 | ## Volume Controls and Audio Quality 2 | 3 | ### Introduction 4 | Volumio is designed to maximise audio quality - ideally, bit-perfect playback. 5 | Some say that allowing the listener to control the playback volume gives up 6 | that bit-perfect ideal, but that's not correct in all circumstances. 7 | 8 | There are two ways to get volume control: 9 | * Software mixer: the audio stream is manipulated to get the desired volume change. 10 | This makes the stream not bit-perfect and degrades sound quality. 11 | * Hardware Mixer: some DACs (not all) have an array of internal resistors they can use to change the volume. 12 | In this mode, you can change the volume while keeping the audio stream bit-perfect and avoid any audio quality degradation. 13 | 14 | ### How to get the best sound _and_ Volume Control 15 | Volumio can detect if your DAC has a Hardware Mixer, and enable it automatically. If your DAC does not support it, Volumio will 16 | allow you to enable the software mixer. To change this behaviour: 17 | * go to Playback Options -> Volume Settings 18 | * Select the Mixer Type: 19 | * None = No volume control 20 | * Software = Volume control but loss of Audio Quality 21 | * Hardware = Best of both worlds, provides ability to change volume without loss of quality 22 | -------------------------------------------------------------------------------- /docs/00_User_Manual/07_Configure_MPD_Clients_for_albumart.md: -------------------------------------------------------------------------------- 1 | ## Configure MPD client for albmart 2 | 3 | When starting the MPod app for the first time: 4 | * Select "Add player manually" and fill in the following information: 5 | - Connection - Name: Volumio 6 | - MPD - Server: ip address or hostname of your volumio device (the hostname defaults to volumio.local) 7 | - Local Cover Art - URL: volumio.local/cover-art 8 | - Local Cover Art - Cover Filename: folder.jpg 9 | 10 | Leave all other settings at the default. 11 | 12 | Important note: The cover art URL including the file name is case sensitive (i.e. folder.jpg != Folder.jpg). All your music folders need to use the same casing. 13 | -------------------------------------------------------------------------------- /docs/00_User_Manual/08_Sending_logs_for_troubleshooting.md: -------------------------------------------------------------------------------- 1 | ## Sending logs for Troubleshooting 2 | 3 | When your Volumio device does not work as expected, crashes or fails in particular conditions, the only way to understand what goes wrong 4 | is usually by looking at logs. So, if you experience such problems, please follow this guide to report your issue to developers. 5 | Volumio features an integrated facility to collect logs of your system and publish them in a way to offer developers a clear way to understand 6 | what is broken on your system. 7 | 8 | ### How to send a bug report 9 | 10 | * Navigate to http://volumio.local/dev or http://yourvolumioip/dev, where 'yourvolumioip' is the actual IP addess of your device eg. 192.168.1.54 11 | 12 | 13 | 14 | * This will open the "DEV" page 15 | * Scroll until you see a section called "Send logs of bug report" 16 | * Fill the text field with a clear, but short description of your problem 17 | * Click on Send 18 | * Once the logs have been successfully sent, you will see a link like "http://logs.volumio.org/xxxxxx" 19 | * Press the copy button to copy the link to your logs in your clipboard 20 | 21 | 22 | 23 | * Paste this log wherever you're requesting for help: a forum thread, a githhub issue or a mail 24 | * If possible, write a very detailed step-to-step guide on how to replicate the problem 25 | -------------------------------------------------------------------------------- /docs/00_User_Manual/09_Other_Customizations.md: -------------------------------------------------------------------------------- 1 | ## Other Customizations 2 | 3 | ### Keyboard layout 4 | 5 | If you want to temporarily change the keyboard layout, you can use the following command: 6 | ``` 7 | sudo loadkeys fr 8 | ``` 9 | ```fr``` should be replaced by the layout you want. 10 | 11 | If you want to permanently change the keyboard layout, you have to run: 12 | ``` 13 | sudo apt-get install keyboard-configuration 14 | ``` 15 | and 16 | ``` 17 | sudo dpkg-reconfigure keyboard-configuration 18 | ``` 19 | This may not work on your system: modifications of this documentation are welcome. 20 | 21 | ### System configuration for Raspberry Pi 22 | 23 | On a Raspberry Pi system configuration parameters are set in a file called /boot/config.txt (https://www.raspberrypi.org/documentation/configuration/config-txt/). 24 | 25 | This file gets overwritten on each Volumio update so user made changes in /boot/config.txt are not preserved. To make them permanent custom settings need to be added to /boot/userconfig.txt instead. 26 | 27 | **Note:** The following options do not work when placed in /boot/userconfig.txt: 28 | ``` 29 | gpu_mem 30 | gpu_mem_256 31 | gpu_mem_512 32 | gpu_mem_1024 33 | total_mem 34 | require_total_mem 35 | startx 36 | start_x 37 | start_debug 38 | boot_partition 39 | legacy_mapping 40 | bootcode_delay 41 | force_pvt 42 | uart_2ndstage 43 | start_file 44 | fixup_file 45 | ``` 46 | -------------------------------------------------------------------------------- /docs/00_User_Manual/img/browse_page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/00_User_Manual/img/browse_page.png -------------------------------------------------------------------------------- /docs/00_User_Manual/img/desktop-main-page.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/00_User_Manual/img/desktop-main-page.jpg -------------------------------------------------------------------------------- /docs/00_User_Manual/img/helper-eighth-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/00_User_Manual/img/helper-eighth-screen.png -------------------------------------------------------------------------------- /docs/00_User_Manual/img/helper-fifth-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/00_User_Manual/img/helper-fifth-screen.png -------------------------------------------------------------------------------- /docs/00_User_Manual/img/helper-first-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/00_User_Manual/img/helper-first-screen.png -------------------------------------------------------------------------------- /docs/00_User_Manual/img/helper-fourth-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/00_User_Manual/img/helper-fourth-screen.png -------------------------------------------------------------------------------- /docs/00_User_Manual/img/helper-second-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/00_User_Manual/img/helper-second-screen.png -------------------------------------------------------------------------------- /docs/00_User_Manual/img/helper-seventh-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/00_User_Manual/img/helper-seventh-screen.png -------------------------------------------------------------------------------- /docs/00_User_Manual/img/helper-sixth-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/00_User_Manual/img/helper-sixth-screen.png -------------------------------------------------------------------------------- /docs/00_User_Manual/img/helper-third-screen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/00_User_Manual/img/helper-third-screen.png -------------------------------------------------------------------------------- /docs/00_User_Manual/img/log_ssh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/00_User_Manual/img/log_ssh.png -------------------------------------------------------------------------------- /docs/00_User_Manual/img/main-page-descr.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/00_User_Manual/img/main-page-descr.jpg -------------------------------------------------------------------------------- /docs/00_User_Manual/img/mobile-main-page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/00_User_Manual/img/mobile-main-page.png -------------------------------------------------------------------------------- /docs/00_User_Manual/img/music_library.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/00_User_Manual/img/music_library.png -------------------------------------------------------------------------------- /docs/00_User_Manual/img/music_library_add_radio.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/00_User_Manual/img/music_library_add_radio.jpg -------------------------------------------------------------------------------- /docs/00_User_Manual/img/music_library_add_url.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/00_User_Manual/img/music_library_add_url.png -------------------------------------------------------------------------------- /docs/00_User_Manual/img/music_library_albums.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/00_User_Manual/img/music_library_albums.jpg -------------------------------------------------------------------------------- /docs/00_User_Manual/img/music_library_artists.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/00_User_Manual/img/music_library_artists.jpg -------------------------------------------------------------------------------- /docs/00_User_Manual/img/music_library_artists_meta.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/00_User_Manual/img/music_library_artists_meta.jpg -------------------------------------------------------------------------------- /docs/00_User_Manual/img/music_library_genres.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/00_User_Manual/img/music_library_genres.png -------------------------------------------------------------------------------- /docs/00_User_Manual/img/music_library_radio.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/00_User_Manual/img/music_library_radio.jpg -------------------------------------------------------------------------------- /docs/00_User_Manual/img/send_log.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/00_User_Manual/img/send_log.png -------------------------------------------------------------------------------- /docs/00_User_Manual/img/send_log2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/00_User_Manual/img/send_log2.png -------------------------------------------------------------------------------- /docs/00_User_Manual/img/settings-main.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/00_User_Manual/img/settings-main.jpg -------------------------------------------------------------------------------- /docs/00_User_Manual/img/ssh_enable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/00_User_Manual/img/ssh_enable.png -------------------------------------------------------------------------------- /docs/00_User_Manual/img/test_mode_enable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/00_User_Manual/img/test_mode_enable.png -------------------------------------------------------------------------------- /docs/00_User_Manual/img/update_ota.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/00_User_Manual/img/update_ota.jpg -------------------------------------------------------------------------------- /docs/01_Development_How_To/00_Overview.md: -------------------------------------------------------------------------------- 1 | ## Overview 2 | 3 | Volumio is an headless audiophile music player, designed to play music with the highest possible fidelity. Volumio runs on most embedded devices (Raspberry Pi, UDOO, Odroid, Cubieboard, Beaglebone...) and on any ordinary PC (x86). 4 | 5 | ### Components 6 | 7 | Volumio is obtained with 3 main components: 8 | 9 | * [Node.js Backend (this repository)](https://github.com/volumio/Volumio2/) 10 | 11 | This is Volumio core infrastructure. The Volumio2 backend runs on your device and accepts connections from different user interfaces (see later). 12 | * [Angular.JS Frontend](https://github.com/volumio/Volumio2-UI) 13 | 14 | This is Volumio's integrated WebUI. It is deployed in /volumio/http/www folder 15 | 16 | * [Debian based minimal OS ](https://github.com/volumio/Build) 17 | 18 | This is Volumio's build script: launch it in a Debian or Ubuntu install, to obtain a complete Volumio Image. 19 | 20 | ### Logins 21 | 22 | Logins 23 | * user : *volumio* 24 | 25 | * Password : *volumio* 26 | 27 | Root login has been disabled by default for security reasons , however user volumio can become root. 28 | 29 | ### Development 101 30 | 31 | To maximize efficiency and reduce code regression we're using [Git Workflow](https://guides.github.com/introduction/flow/). For example, to create a new feature you'll: 32 | * Create a new branch, named after the feature 33 | * Do your things on the branch 34 | * Test if everything is fine and we don't have regressions 35 | * Submit a Pull Request for branch dev 36 | 37 | 38 | All new improvements and developments are meant to be done on the dev branch, once it's declared stable it will be merged to master and deployed to happy Volumio users. 39 | 40 | 41 | ### Development Guidelines 42 | 43 | * [Forum Threads](http://volumio.org/forum/discussion-t2098-10.html) for internal discussion, remember to subscribe topics. 44 | * Document your work where possible on the [Wiki](https://github.com/volumio/Volumio2/wiki). 45 | * This is intended to run on Low Power Devices (r-pi). Let's keep code efficient and lightweight. 46 | * To allow code mantainability, always comment your code properly and update DOCs if needed. 47 | * Adhere to [MVC Best Practices](http://www.yiiframework.com/doc/guide/1.1/en/basics.best-practices) to maximize project quality. 48 | * Have fun and enjoy what you're doing! 49 | -------------------------------------------------------------------------------- /docs/01_Development_How_To/02_Set_up_development_environment_introduction.md: -------------------------------------------------------------------------------- 1 | ## Development environment 2 | 3 | In order to develop new functionalities of Volumio, depending on which part you want to improve, you need to set up a development environment. 4 | Volumio is designed to be an highly integrated system. This means that the WebUi is optimized to work along with the custom made Volumio system, and therefore it needs to run in a very tightly controlled environment. IT WON'T WORK on standard Raspbian or other non-volumio OSes. If you want to know what kind of customizations we're using, take a look at the [Volumio Builder](https://github.com/volumio/Build) 5 | 6 | So, we suggest to have a running Volumio device connected to your local network, while developing on your machine 7 | 8 | * [the Backend](Set_up_development_environment_for_backend) 9 | * [the UI](Set_up_development_environment_for_UI) 10 | 11 | If you are interested in creating your own images please read on here: 12 | 13 | * [Creating Volumio Images](Set_up_development_environment_for_Volumio_images) -------------------------------------------------------------------------------- /docs/01_Development_How_To/03_Set_up_development_environment_for_backend.md: -------------------------------------------------------------------------------- 1 | ## Setting up a development environment for Volumio2 NODE Backend 2 | 3 | In this scenario, we will develop direclty on the Volumio device, but editing the main files on your PC\MAC. There are several ways to achieve such result 4 | 5 | * Mount the /volumio directory of your device to a Folder on your system via sftp (volumio:volumio) 6 | * Use an IDE that allows remote deplyoment (like [Atom](https://atom.io/) or [Webstorm](https://www.jetbrains.com/webstorm/) which we suggest since its simply awesome!) 7 | 8 | *IMPORTANT*: If you want to develop on the latest version, you can simply launch this command to obtain the latest code on master branch: 9 | 10 | ```shell 11 | volumio pull 12 | ``` 13 | 14 | If you want to develop or test a certain branch you can use the following command, replacing `` with the real name of the branch: 15 | 16 | ``` 17 | volumio pull -b 18 | ``` 19 | 20 | If you want to develop or test a certain branch of a forked repository you can use the following command, replacing `` with the real name of the branch and `` with the real name of the repository URL, e.g. something like `https://github.com/user_who_forked_volumio/Volumio2.git` 21 | 22 | ``` 23 | volumio pull -b 24 | ``` 25 | -------------------------------------------------------------------------------- /docs/01_Development_How_To/04_Set_up_development_environment_for_UI.md: -------------------------------------------------------------------------------- 1 | ## Setting up a development environment for Volumio2 UI 2 | 3 | Volumio2 UI is an [AngularJS](https://angularjs.org/) based WebAPP. You can develop on it from your PC\MAC but you need to have a Volumio device on your network. 4 | The UI communicates with Volumio's backend via [WebSockets](/docs/API/WebSocket_APIs) using Socket.io [Socket.io](http://socket.io/) 5 | 6 | To set up a development environment on your PC\MAC do: 7 | 8 | ### Install dependencies (only first time) 9 | * Download and install [Node.js](https://nodejs.org/it/download/) 10 | ** Volumio2-UI currently requires '''Node.js 6.*'''. [6.9.5](https://nodejs.org/dist/v6.9.5/) 11 | * Download and install [Bower](https://bower.io/#install-bower) 12 | * Download and install [Gulp](https://github.com/gulpjs/gulp/blob/master/docs/getting-started/1-quick-start.md) 13 | 14 | ### Prepare Volumio2 UI Development folder 15 | 16 | * Clone the UI with: 17 | 18 | ```shell 19 | git clone https://github.com/volumio/Volumio2-UI 20 | ``` 21 | 22 | We suggest developing on the *development* branch, and to push your Pull requests there: 23 | 24 | ```shell 25 | cd Volumio2-UI 26 | git checkout development 27 | ``` 28 | 29 | * Install npm dependencies 30 | ```shell 31 | npm install 32 | ``` 33 | 34 | * Install bower dependencies 35 | ```shell 36 | bower install 37 | ``` 38 | 39 | * Tell the UI where our Volumio instance is : 40 | 41 | Now, you can develop on it, while retrieving data from Volumio2 backend (you must have a Volumio2 device on your network and know its IP address). To tell the UI where to find Volumio 2 backend, create a file with the IP of Volumio2 in 42 | ```shell 43 | /src/app/local-config.json 44 | ``` 45 | The file will look like 46 | 47 | ```json 48 | { 49 | "localhost": "http://192.168.31.234" 50 | } 51 | ``` 52 | 53 | Now, feel free to edit and see live changes on a local browser with dynamically generated UI. To do so: 54 | ```shell 55 | gulp serve --theme="volumio" 56 | ``` 57 | 58 | Once finished, to deploy on Volumio 2, first build it. if you want production optimization use --env="production" 59 | 60 | ```shell 61 | gulp build --theme="volumio" --env="production" 62 | ``` 63 | 64 | And deploy by copying the content of dist directory on Volumio2 device to: 65 | ```shell 66 | /volumio/http/www 67 | ``` -------------------------------------------------------------------------------- /docs/01_Development_How_To/05_Set_up_development_environment_for_Volumio_images.md: -------------------------------------------------------------------------------- 1 | ## Setting up a development environment for Volumio 2 images 2 | 3 | We suggest to develop on a debian based environment 4 | 5 | ### Install dependencies 6 | 7 | ``` 8 | git squashfs-tools kpartx multistrap qemu-user-static samba debootstrap parted dosfstools qemu binfmt-support qemu-utils 9 | ``` 10 | 11 | ### Set up development folder 12 | 13 | - clone the build repo on your local folder : git clone https://github.com/volumio/Build build 14 | - if on Ubuntu, you may need to remove `$forceyes` from line 989 of /usr/sbin/multistrap 15 | - cd to /build and type 16 | 17 | ``` 18 | ./build.sh -b -d -v 19 | ``` 20 | 21 | where switches are : 22 | 23 | * -b `` Build a full system image with Multistrap. Options for the target architecture are **arm** or **x86**. 24 | * -d `` Create Image for Specific Devices. Supported device names: 25 | **pi**, **odroidc1/2/xu4/x2**, udoo, cuboxi, bbb, cubietruck, compulab, **x86** 26 | * -l `` Create docker layer. Give a Docker Repository name as the argument. 27 | * -v `` Version 28 | 29 | Example: Build a Raspberry PI image from scratch, version 2.0 : 30 | ``` 31 | ./build.sh -b arm -d pi -v 2.0 -l reponame 32 | ``` 33 | 34 | You do not have to build the architecture and the image at the same time. 35 | 36 | Example: Build the architecture for x86 first and the image version MyVersion in a second step: 37 | ``` 38 | ./build.sh -b x86 39 | 40 | ./build.sh -d x86 -v MyVersion 41 | ``` 42 | -------------------------------------------------------------------------------- /docs/01_Development_How_To/06_Updating_source_files.md: -------------------------------------------------------------------------------- 1 | ## Update source files 2 | 3 | When you make changes to any file of Volumio, you can restart the service with 4 | 5 | ```shell 6 | killall node 7 | ``` 8 | 9 | or 10 | 11 | ```shell 12 | systemctl restart volumio 13 | ``` 14 | -------------------------------------------------------------------------------- /docs/01_Development_How_To/07_Debugging.md: -------------------------------------------------------------------------------- 1 | ## Debugging 2 | 3 | ### Debugging Volumio2 Backend 4 | 5 | 6 |

Debugging Volumio 2 with Webstorm from Shaggy Dog on Vimeo.

7 | 8 | the same approach is possible for other editors like Visual Studio Code and Eclipse for nodejs 9 | 10 | ### Debugging with system journal 11 | 12 | You can see all logs, generated both by the system and Volumio with 13 | 14 | ```shell 15 | sudo journalctl -f 16 | ``` 17 | 18 | This includes outputs to the console too: 19 | 20 | ```javascript 21 | console.log('my output') 22 | ``` 23 | 24 | So, ideally, you'll want to: 25 | 26 | * Edit the files from your editor of choice 27 | * Upload changes to the Volumio device 28 | * Restart NODE Services 29 | * See the effects via an SSH connection, with sudo journalctl -f 30 | -------------------------------------------------------------------------------- /docs/01_Development_How_To/img/architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/01_Development_How_To/img/architecture.png -------------------------------------------------------------------------------- /docs/02_API/01_API_Overview.md: -------------------------------------------------------------------------------- 1 | ## Introduction 2 | 3 | ### Volumio's main API: websocket 4 | 5 | The most used API transport in Volumio2 is its Websockets API as it allows almost real time communication with multiple clients. Volumio's WebUI gets and sends data (almost) exclusively via WS. Volumio's WS layer is powered by [Socket.io](http://socket.io/). 6 | The WebSocket API interface is located at: [WebSocket](https://github.com/volumio/Volumio2/tree/master/app/plugins/user_interface/websocket) 7 | 8 | Full documentation about Volumio Websocket protocol is provided in the next section 9 | 10 | ### Volumio's REST API 11 | 12 | Alternatively, a small subset of system calls are available trough RESTful APIs, in json format. They are available in the REST API section 13 | -------------------------------------------------------------------------------- /docs/03_Plugin_System/05_Toast_Messages.md: -------------------------------------------------------------------------------- 1 | ## Toast Messages 2 | 3 | ### Enable Toast Messages 4 | 5 | For easier usage make sure you assign the coreCommand instance in the consturctor of your plugin: 6 | 7 | ```javascript 8 | module.exports = ExamplePlugin; 9 | function ExamplePlugin(context) { 10 | var self = this; 11 | self.context = context; 12 | self.commandRouter = this.context.coreCommand; 13 | } 14 | ``` 15 | 16 | ### Create Toast Message 17 | 18 | At any place in your code you can then call the `commandRouter.pushToastMessage` method to show a toast messages to the user: 19 | 20 | ```javascript 21 | self.commandRouter.pushToastMessage('success', "Account Login", "Login was successful"); 22 | ``` 23 | 24 | There are four kinds of toast messages: `info`, `success`, `warning` and `error`: 25 | 26 | ```javascript 27 | self.commandRouter.pushToastMessage('info', "Account Login", "Login pending...."); 28 | self.commandRouter.pushToastMessage('success', "Account Login", "Login was successful"); 29 | self.commandRouter.pushToastMessage('warning', "Account Login", "Login not possible"); 30 | self.commandRouter.pushToastMessage('error', "Account Login", "Login failed - invalid credentials"); 31 | ``` 32 | -------------------------------------------------------------------------------- /docs/03_Plugin_System/06_Logging.md: -------------------------------------------------------------------------------- 1 | ## Logging 2 | 3 | ### Enable Logging 4 | 5 | For easier usage make sure you assign the `context.logger` instance in the consturctor of your plugin: 6 | 7 | ```javascript 8 | module.exports = ControllerSpop; 9 | function ControllerSpop(context) { 10 | var self = this; 11 | self.logger = this.context.logger; 12 | } 13 | ``` 14 | 15 | ### Create Log Message 16 | 17 | At any place in your code you can then call the methods of the logger instance: 18 | 19 | ```javascript 20 | self.logger.info("Youtube::onStart Adding to browse sources"); 21 | ``` 22 | 23 | The logger instance has the following methods to create log messages: `info`, `warn`, `error` and `debug`. 24 | 25 | Volumio is using [winston](https://github.com/winstonjs/winston) for logging. -------------------------------------------------------------------------------- /docs/03_Plugin_System/07_User_Modal.md: -------------------------------------------------------------------------------- 1 | ## User Modal 2 | 3 | It is possible to interact with your plugin's user in real time using modals. 4 | 5 | Here's an example: 6 | 7 | ```javascript 8 | var modalData = { 9 | title: 'Modal', 10 | message: 'Something occured, you may react, or close this window', 11 | size: 'lg', 12 | buttons: [ 13 | { 14 | name: 'Close', 15 | class: 'btn btn-warning' 16 | }, 17 | { 18 | name: 'React', 19 | class: 'btn btn-info', 20 | emit:'react', 21 | payload:'' 22 | } 23 | ] 24 | } 25 | 26 | self.commandRouter.broadcastMessage("openModal", modalData); 27 | ``` 28 | 29 | In the previous example, a modal is created by the plugin at runtime. 30 | Whatever button the user presses, the modal will close. 31 | 32 | The "React" button however will also emit a "react" socketIO event, which can be handled directly by the plugin. 33 | 34 | This section is potentially incomplete and needs revisiting, but it should work. 35 | -------------------------------------------------------------------------------- /docs/03_Plugin_System/img/plugin_enable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/03_Plugin_System/img/plugin_enable.png -------------------------------------------------------------------------------- /docs/03_Plugin_System/img/plugin_list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/03_Plugin_System/img/plugin_list.png -------------------------------------------------------------------------------- /docs/03_Plugin_System/img/plugin_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/03_Plugin_System/img/plugin_menu.png -------------------------------------------------------------------------------- /docs/05_Porting_Guide/01_Introduction.md: -------------------------------------------------------------------------------- 1 | ## Introduction ## 2 | 3 | ### Note ### 4 | This is work in progress and will be updated the coming couple of days 5 | Last change: 18.06.2017/ gkkpch 6 | 7 | ### What does it cover ### 8 | This is a __guideline__ for porting Volumio to new ARM platforms, not a step-by-step instruction or cookbook. 9 | It covers most of the steps needed: 10 | * Creating/ compiling u-boot to make the new board image bootable 11 | * Compiling a suitable kernel, the device tree, modules and firmware 12 | * Creating a platform repo to support the build process 13 | * Creating the board-specific image.sh script 14 | * Creating the board-specific config.sh script 15 | 16 | As arm devices can differ regarding kernel version, supported u-boot version, boot parameters, and partition layout, board-specific properties have to be taken into account. 17 | Example: some board images use uEnv.txt or boot.ini to describe the boot parameters, others use a compiled boot.scr. 18 | Or, as we will see in our build example, a combination of a compiled boot.scr and a text file to override certain defined parameters. 19 | As for u-boot, some can be compiled directly from ____ (mostly newer boards with a mainline kernel), some need additional blobs. 20 | For some boards, blobs, SPL and u-boot are written to a device in separate steps, for others an image from u-boot and spl binary must be prepared and written to the device. 21 | The purpose of this guide is to offer help in finding the information you need to cover all these different issues. 22 | Again, the guide is not a cookbook, but it will use the Asus Tinkerboard as an example from chapter 4 onwards, describing in detail how it was done for that particular device. 23 | 24 | ### Advice ### 25 | Try to find an example build procedure for another OS, a good source of information is usually the suppliers own BSP (Board Support Package) repo or forums and wiki's (e.g. the excellent Hardkernel wiki). 26 | Also our friends at ____ are doing an awesome job supporting relevant devices, not only do the offer their own ARMBIAN distribution, they are excellent at supporting their kernels up-to-date by patching whenever relevant. 27 | In case the Armbian Team does not support your device, you are probably going to have a hard time finding a better source for info. 28 | Another good source of information (also with lots of contributions from the Armbian Team), but dedicated to Allwinner SoC based devices, is ____ 29 | 30 | Look for things like “How to build an SD card for .....”, it makes the porting a lot easier. 31 | -------------------------------------------------------------------------------- /docs/05_Porting_Guide/03_Preparing_The_Build_Environment.md: -------------------------------------------------------------------------------- 1 | ## Preparing the Build Process ## 2 | 3 | ### Necessary packages ### 4 | The following packages need to be installed on your build machine, you will need them sooner or later in the build process. 5 | 6 | git squashfs-tools kpartx multistrap qemu-user-static samba debootstrap parted dosfstools qemu binfmt-support lzop chrpath gawk texinfo libsdl1.2-dev whiptail diffstat cpio libssl-dev 7 | 8 | ### Optional ### 9 | 10 | qemu-utils (only needed if x86 will be built with the machine too ) 11 | 12 | ### Special Requirement for Rockchip on Debian jessie ### 13 | 14 | Jessie's u-boot tool 'mkimage' is too old to support a "rksd"-type image, needed for u-boot creation with Rockchip SoC's (see "Compiling U-Boot"). 15 | In case you build for Rockchip, you need to download a newer version, at least __2016.11+dfsg1-4__, and install it over jessie's 2014.10+dfsg1-5: 16 | 17 | wget http://ftp.debian.org/debian/pool/main/u/u-boot/u-boot-tools_2016.11+dfsg1-4_amd64.deb 18 | dpkg -i u-boot-tools_2016.11+dfsg1-4_amd64.deb 19 | rm u-boot-tools_2016.11+dfsg1-4_amd64.deb 20 | 21 | ### Toolchain ### 22 | You need to crosscompile for arm, this means you need the proper toolchain and also take care to use the correct version. 23 | For older kernels and u-boot we used GCC-4.9.3 (Odroids, arm and aarch64), some require GCC-5, newer ones (like our build example with the Asus Tinkerboard) now require gcc-6.1 24 | You can download the toolchain from the Linaro organisation: ____ 25 | 26 | Create a folder /opt/toolchains and extract the tarball in it (example with gcc-4.9.3) 27 | 28 | sudo mkdir -p /opt/toolchains 29 | sudo tar xvf gcc-linaro-arm-linux-gnueabihf-4.9-2014.11_linux.tar.xz -C /opt/toolchains/ 30 | 31 | Add the path to PATH and set environment variables, best to add them to $HOME/.bashrc, just add the following lines: 32 | 33 | export ARCH=arm 34 | export CROSS_COMPILE=arm-linux-gnueabihf- 35 | export PATH=/opt/toolchains/gcc-linaro-4.9-2014.11-x86_64_arm-linux-gnueabihf/bin/:$PATH 36 | 37 | You can apply the change by logging out and in again or evaluate $HOME/.bashrc with source command. 38 | 39 | source ~/.bashrc 40 | 41 | Check if the toolchain works properly by checking its version, if you can find gcc version string at the end of the output, you’re OK. 42 | 43 | arm-linux-gnueabihf-gcc -v 44 | Using built-in specs 45 | … 46 | … 47 | … 48 | … 49 | gcc version 4.9.3 20141031 (prerelease) (Linaro GCC 2014.11) 50 | 51 | 52 |   53 | -------------------------------------------------------------------------------- /docs/05_Porting_Guide/04_Example: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/05_Porting_Guide/04_Example -------------------------------------------------------------------------------- /docs/05_Porting_Guide/05_The_Process.md: -------------------------------------------------------------------------------- 1 | ## The Process ## 2 | 3 | When Volumio was ported to odroid c1, c2, xu4, cubox-i and pine64, we did things more or less in the same order, let's do this for the Tinkerboard too: 4 | * Make a platform home folder 5 | * Get u-boot and related info (defconfig, offsets for placing the u-boot on disk) 6 | * Get the kernel sources and corresponding config file 7 | * Compile u-boot and assemble u-boot.bin 8 | * Compile the kernel, this should give you the kernel (zImage or uImage), the binary device tree (dtb), modules and firmware. 9 | 10 | You do not need to set all the kernel options right yet. 11 | At this stage in the process it is more important that the first resulting image will boot. 12 | All other options can be added after the basics have been done. 13 | Make sure that you have at least __overlayfs__ (File Systems) and __squashfs__ (Miscellaneous Filesystems ) enabled as modules and also the kernel has __support for initramfs__. 14 | 15 | There is more information on how u-boot must be built in ____ 16 | -------------------------------------------------------------------------------- /docs/05_Porting_Guide/06_The_Platform_Folder.md: -------------------------------------------------------------------------------- 1 | ## The Platform Folder ## 2 | 3 | Create the platform folder. This will be used to store all device-specific files, like kernel, boot configuration, u-boot and SPL files and anything we find during the build which is board specific goes here. 4 | This folder gets tarred in the end and moved into a separate volumio repo, described in __Saving Files to the Platform Folder__. 5 | 6 | We presumed the board is called tinkerboard and we have the location of the kernel and u-boot, including the config files which we will use. 7 | Assuming, Asus will released further sbc's in the future, we will name the platform folder "platform_asus" and create a subfolder "tinkerboard" which will hold the platform files for that board. 8 | 9 | Then start preparing, assuming the root of the platform files is in $HOME/asus-build 10 | 11 | mkdir $HOME/asus-build/platform-asus 12 | mkdir $HOME/asus-build/platform-asus/tinkerboard/boot 13 | mkdir $HOME/asus-build/platform-asus/tinkerboard/etc 14 | mkdir $HOME/asus-build/platform-asus/tinkerboard/u-boot 15 | mkdir $HOME/asus-build/platform-asus/tinkerboard/usr 16 | 17 | Note: eventually you need to add the platform folder to the Volumio repo. 18 | This does not need to be done immediately. 19 | Chapter "Creating the image" shows a way to build an image before integrating the new scripts and platform files into the repo. 20 | The same method can be used to test new platform files before they are pushed. 21 | When integration is due, get in touch with @volumio (Micelangelo) to have him create the platform-file repo, in our case "platform-asus". 22 | Fork this one and clone it to your host PC, add (or edit) the README.md file. 23 | This file should at least contain a reference the used kernel source location, u-boot and other relevant device-specific info. 24 | Best practise also means you keep a changelog in README.md. 25 | Examples of README.md in are in the Volumio Platform repos. 26 | -------------------------------------------------------------------------------- /docs/05_Porting_Guide/07_Compiling_U-Boot.md: -------------------------------------------------------------------------------- 1 | ## Compiling U-Boot ## 2 | 3 | ### Clone u-boot ### 4 | 5 | git clone git://git.denx.de/u-boot.git u-boot -b master --depth 1 6 | 7 | ### Patches ### 8 | At the time of writing, there is a correction/ change for u-boot, which has not been committed to the official U-Boot repository yet. 9 | It deals with fixing an eth mac address. 10 | When volumio is configured to use dhcp for eth (which is default), the device should not get a new IP address every time the device is booted. 11 | With this patch, a fixed eth mac address is generated, using device-specific info from an EEPROM. 12 | The patch file is in folder "platform-files", under "patches". 13 | Copy the patch to the root of the u-boot folder and apply it like this: 14 | 15 | patch -p1 < tinker_set_ethaddr_in_late_init.patch 16 | 17 | ### Compile ### 18 | There is a u-boot configuration for the Tinkerboard in the master branch, we will compile u-boot using it: 19 | 20 | cd u-boot 21 | make clean (does not do anything here as we just cloned) 22 | make tinker-rk3288_defconfig 23 | touch .scmversion (to get a clean u-boot version number) 24 | make -j8 25 | 26 | #### assumption #### 27 | DEST=$HOME/platform-asus/tinkerboard 28 | 29 | ### Create the u-boot.img ### 30 | For a correct boot process, the u-boot spl and u-boot dtb are combined into a single u-boot.bin file, to be used for the Tinkerboard image build script. 31 | 32 | mkimage -n rk3288 -T rksd -d spl/u-boot-spl-dtb.bin ../platform-asus/tinkerboard/u-boot/u-boot.img 33 | mkdir $DEST/u-boot (in case not yet existing) 34 | cat u-boot-dtb.bin >> $DEST/u-boot/u-boot.img 35 | 36 | The u-boot image must be copied to the beginning of the device, skip 64 blocks for the location of the loader. 37 | This should be done in the tinkerimage.sh script, to be explained later. 38 | 39 | dd if=platform-asus/tinkerboard/u-boot/u-boot.img of=${LOOP_DEV} seek=64 conv=notrunc 40 | -------------------------------------------------------------------------------- /docs/05_Porting_Guide/08_Get_The_Kernel_Source.md: -------------------------------------------------------------------------------- 1 | ## Getting the kernel Source ## 2 | ### Use the Armbian Tool to get a patched kernel 4.4.xx ### 3 | 4 | We will use the armbian toolset to download and compile the kernel only. 5 | Go to ____ 6 | Make sure you meet the requiremens in “What do I need” 7 | 8 | Follow the guide to run the script 9 | 10 | ./compile.sh KERNEL_ONLY=yes KERNEL_KEEP_CONFIG=yes 11 | 12 | From the menu, select “Kernel and u-boot packages”. 13 | Then select “Tinkerboard” from the supported boards menu. 14 | You will then have to select the kernel version & branch. 15 | Pick the default “Vendor Provided / legacy (3.4.x – 4.4.x)” from the presented list. 16 | This is not really “Vendor provided” in the true sense, as Armbian then clones from the mqmaker repo as explained above. 17 | You can forget about u-boot and sunxi-tools, we do not need them for our purpose. 18 | 19 | When you're building on a Ubuntu machine, you can continue with kernel compilation in 20 | 21 | $HOME/sources/linux-rockchip/miqi/release-4.4 22 | 23 | Otherwise 24 | 25 | cd $HOME/sources/linux-rockchip/miqi/release-4.4 26 | sudo make clean 27 | cd .. 28 | sudo tar cvfJ release-4.4.tar.xz ./release-4.4 29 | 30 | ...then transfer the tarball, create $HOME/sources/linux-rockchip/miqi on your target system and unpack it in the miqi folder 31 | -------------------------------------------------------------------------------- /docs/05_Porting_Guide/09_Configure_Kernel_Options.md: -------------------------------------------------------------------------------- 1 | ## Changing Kernel Options, Volumio requirements ## 2 | ### Basics ### 3 | support for initramfs 4 | overlayfs 5 | squashfs 6 | nfs server 7 | 8 | ### Volumio 2 reqs ### 9 | usb audio 10 | board's soc sound options and codes 11 | iptables 12 | all built-in wireless options (wifi/bluetooth) and possible wifi dongles 13 | -------------------------------------------------------------------------------- /docs/05_Porting_Guide/09_Get_The_Kernel_Source.md: -------------------------------------------------------------------------------- 1 | ## Getting the kernel Source ## 2 | ### Use the Asus Tinkerboard Repo to get the kernel source (4.4.xx) ### 3 | 4 | Luckily, Asus now supplyies their own kernel repo 5 | Start with downoading onto your Home folder 6 | 7 | git clone http://github.com/tinkerboard/debian_kernel linux-asus 8 | 9 | ### Patches ### 10 | 11 | Sometimes, especially with brand new boards, changes are made by others, which would suit Volumio but haven't found their way into the (vendor's) kernel repo. 12 | A way to get these into our kernel is applying these changes aspatches. 13 | At the time of writing, 3 patches are know, which I will apply from one single patch file. 14 | It deals with: 15 | 16 | - Change in the kernel compile 'makefile' in order to eliminate two very strict syntax checks, which causes the compile to fail with gcc version 6. The best way would have been to fix the sources, but I consider that a task for the maintainers. 17 | - Change to the behavior of two board leds, allowing one blinking as a heartbeat and the other one blinking for disk activity 18 | - an entry in the usb quirks table, to show the internal usb audio device to show a friendly name (Tinkerboard) 19 | 20 | The patch is in the plaform-asus folder, under "patches": Volumio-Kernel.patches. 21 | Copy it to the kernel root folder and apply as follows: 22 | 23 | patch -p1 < Volumio-Kernel.patches 24 | -------------------------------------------------------------------------------- /docs/05_Porting_Guide/10_Compiling_The_Kernel.md: -------------------------------------------------------------------------------- 1 | ## Compiling the Kernel ## 2 | 3 | Armbian was using a default config linux-rockchip-default.config, to be found in $HOME/lib/config/kernel, which should be copied to ................. arch/arm/configs 4 | DEFCONFIG=linux-rockchip-default.config 5 | DTB=rk3288-miniarm.dtb 6 | 7 | 8 | make clean does nothing on first compile, as there is nothing to clean. 9 | Otherwise it is a good idea to start with this when options are going to be changed. 10 | 11 | cd $HOME/sources/linux-rockchip/miqi/release-4.4 12 | make clean 13 | make linux-rockchip-default_defconfig 14 | make menuconfig 15 | 16 | At this stage go to section File Systems and make sure overlayfs has been enabled as a module. 17 | Then go to Miscellaneous Filesystems and check if squashfs has been enabled as a module (including the various compression options). 18 | Then save and exit menuconfig. 19 | 20 | When you want to keep the changes permanent: 21 | 22 | cp .config arch/arm/configs/my_tinker-default_defconfig 23 | 24 | Or easier if you keep the same name: 25 | 26 | make savedefconfig 27 | 28 | Continue compiling the kernel 29 | 30 | make -jx (For x take 1.5 times the number of cpus you have available) 31 | 32 | Save the kernel and dtb's 33 | 34 | cp arch/arm/boot/zImage your-platform-file-folder/boot 35 | cp arch/arm/boot/dts/*.dtb your-platform-file-folder/boot/dtb 36 | 37 | Save the modules and firmware 38 | -------------------------------------------------------------------------------- /docs/05_Porting_Guide/10_Configure_Kernel_Options.md: -------------------------------------------------------------------------------- 1 | ## Changing Kernel Options, Volumio requirements ## 2 | ### Basics ### 3 | support for initramfs 4 | overlayfs 5 | squashfs 6 | nls437 7 | nfs server 8 | 9 | ### Volumio 2 reqs ### 10 | usb audio 11 | board's soc sound options and codes 12 | iptables 13 | all built-in wireless options (wifi/bluetooth) and possible wifi dongles 14 | 15 | Wherever possible, configure the options as a module (no need to blow up the kernel for things we not always use) 16 | -------------------------------------------------------------------------------- /docs/05_Porting_Guide/11_Compiling_The_Kernel.md: -------------------------------------------------------------------------------- 1 | ## Compiling the Kernel ## 2 | 3 | First we will rename the kernel config to something more logical. 4 | This is normally not necessary, but in this case we started when the original miniarm-rk3288 was not renamed to Tinker Board yet. 5 | 6 | cd linux-asus/arch/arm/configs 7 | cp miniarm-rk3288_defconfig tinker-rockchip_defconfig 8 | 9 | We will use this renamed default kernel config 10 | 11 | Let us build the kernel step by step. 12 | Of course 'make clean' does nothing on first compile, as there is nothing to clean. 13 | Otherwise it is a good idea to start with this when options are going to be changed. 14 | After that we select the kernel config tu use and in this case we also start kernel configuration. 15 | 16 | cd $HOME/linux-asus 17 | make clean 18 | make tinker-rockchip_defconfig 19 | make menuconfig 20 | 21 | At this stage ensure all minimum options from the previous chapter have been selected. 22 | To get a bootable, first volumio image, we need at least overlayfs, squashfs and nls437 as a module. 23 | Then save and exit menuconfig. 24 | 25 | When you want to keep the changes permanent: 26 | 27 | cp .config arch/arm/configs/my_tinker-default_defconfig 28 | 29 | Or easier if you keep the same name: 30 | 31 | make savedefconfig 32 | 33 | Continue compiling the kernel 34 | 35 | make -jx (For x take 1.5 times the number of cpus you have available) 36 | 37 | This does all the work defined in the makefile, including dts compilation 38 | -------------------------------------------------------------------------------- /docs/05_Porting_Guide/12_Boot_Parameters.md: -------------------------------------------------------------------------------- 1 | 2 | ## Boot Parameters # 3 | Boot configuration depends on the u-boot version in use for the particular platform. 4 | Always look for prebuilt vendor images, they are a good source of the option(s) you have. 5 | 6 | With the u-boot version we use, there are several options to achieve boot configuration with our requirements. 7 | Below is a script we would have used with an armbian based kernel/ u-boot, it is based on a compiled boot.scr (from boot.cmd) and an optional text file to override predefined variables. Very flexible and works with many platforms. 8 | 9 | ### boot.scr ### 10 | setenv volumioenv "/dev/mmcblk0p1" 11 | setenv fdt_file "rk3288-miqi.dtb" 12 | setenv ramdisk_addr_r "0x21000000" 13 | setenv console "ttyS2,115200n8" 14 | setenv verbosity "1" 15 | 16 | itest.b ${devnum} == 0 && echo "U-boot loaded from SD" 17 | itest.b ${devnum} == 1 && echo "U-boot loaded from eMMC" 18 | 19 | if load ${devtype} ${devnum}:1 ${ramdisk_addr_r} /boot/volumio-env.txt || load ${devtype} ${devnum}:1 ${ramdisk_addr_r} volumio-env.txt; then 20 | env import -t ${ramdisk_addr_r} ${filesize} 21 | fi 22 | 23 | setenv bootargs "consoleblank=0 scandelay ${volumioenv} rw console=${console} rootfstype=ext4 loglevel=${verbosity} rootwait ${extraargs} " 24 | ext4load ${devtype} ${devnum}:1 ${fdt_addr_r} /boot/dtb/${fdt_file} || fatload ${devtype} ${devnum}:1 ${fdt_addr_r} dtb/${fdt_file} || ext4load ${devtype} ${devnum}:1 ${fdt_addr_r} dtb/${fdt_file} 25 | ext4load ${devtype} ${devnum}:1 ${ramdisk_addr_r} /boot/uInitrd || fatload ${devtype} ${devnum}:1 ${ramdisk_addr_r} uInitrd || ext4load ${devtype} ${devnum}:1 ${ramdisk_addr_r} uInitrd 26 | ext4load ${devtype} ${devnum}:1 ${kernel_addr_r} /boot/zImage || fatload ${devtype} ${devnum}:1 ${kernel_addr_r} zImage || ext4load ${devtype} ${devnum}:1 ${kernel_addr_r} zImage 27 | bootz ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r} 28 | 29 | # Recompile this script with 30 | # mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr 31 | # or 32 | # Edit volumio-env.txt to override defined setenv parameters 33 | 34 | This would be the corresponding volumio-env.txt file 35 | 36 | verbosity=1 37 | volumio=imgpart=/dev/mmcblk0p2 imgfile=/volumio_current.sqsh 38 | console=tty2,ttyS2,115200n8 39 | 40 | ### extlinux/extlinux.conf ### 41 | 42 | As there is no requirement for flexibility and hardly anything we need to configure for Volumio, the extlinux.conf option in the boot partition is all we need. 43 | The file is located in boot/extlinux and has the following content, adapted from one of the Asus prebuilt images: 44 | 45 | label kernel-4.4 46 | kernel /zImage 47 | fdt /dtb/rk3288-miniarm.dtb 48 | initrd /uInitrd 49 | append earlyprintk console=tty1 console=ttyS1,115200n8 imgpart=/dev/mmcblk0p2 imgfile=/volumio_current.sqsh 50 | -------------------------------------------------------------------------------- /docs/05_Porting_Guide/14_Saving_Files_To_The_Platform_Folder.md: -------------------------------------------------------------------------------- 1 | ## Saving the files to the Platform Folder ## 2 | 3 | We are now ready to save all he files to the platform-asus folder, where they can be picked up to be used from the volumio tinker board build script. 4 | 5 | ### Assumptions ### 6 | 7 | DESTDIR=$HOME/asus-build/platform-asus/tinkerboard 8 | KERNELDIR=$HOME/linux-asus 9 | UBOOTDIR=$HOME/u-boot 10 | 11 | ### u-boot ### 12 | Assuming you compiled u-boot from the guideline above, you already saw how the u-boot image landet in the latform folder. 13 | For the kernel we want to do a little more. It is always handy to the last few kernel configurations. 14 | It is good practise, to copy the current kernel config to the boot folder. In the boot folder should only hold the current one. 15 | Chapter 2 also showed how to save the config to the kernel. 16 | To help identify the con fig file, I like adding the kernel version to the filename, including a timestamp. 17 | 18 | kver=`make kernelrelease`-`date +%Y.%d.%m-%H.%M` 19 | rm $DESTDIR/boot/config* 20 | cp .config $DESTDIR/boot/config-${kver} 21 | cp .config $DESTDIR/config-${kver} 22 | 23 | ### Kernel ### 24 | Next step is to save the kernel, in this case a zImage, and the dts 25 | 26 | cp arch/arm/boot/zImage $DESTDIR/boot 27 | cp arch/arm/boot/dts/*.dtb $DESTDIR/boot/dtb 28 | 29 | ### Modules and firmware ### 30 | For building an image, the only thing missing are the modules and firmware. 31 | Best is to delete the previous lib folder, avoiding the risk to save the ones from an older kernel version 32 | 33 | rm -r $DESTDIR/lib 34 | make modules_install ARCH=arm INSTALL_MOD_PATH=$DESTDIR 35 | make firmware_install ARCH=arm INSTALL_FW_PATH=$DESTDIR/lib/firmware 36 | 37 | ### Patches and other files ### 38 | As we do not want to loose the patches, we save these as well (though we only need these once after cloning the repos. 39 | 40 | git diff > $DESTDIR/tinkerboard/patches/Volumio-Kernel.patches 41 | -------------------------------------------------------------------------------- /docs/05_Porting_Guide/15_A_Complete_Script.md: -------------------------------------------------------------------------------- 1 | ## Creating a complete Script for compiling U-Boot and Kernel ## 2 | 3 | 4 | #!/bin/sh 5 | DESTDIR=$HOME/asus-build/platform-asus/tinkerboard 6 | KERNELDIR=$HOME/linux-asus 7 | UBOOTDIR=$HOME/u-boot 8 | TARDIR=/media/nas/asus 9 | 10 | echo "Compiling u-boot..." 11 | cd $UBOOTDIR 12 | touch .scmversion 13 | make clean 14 | make tinker-rk3288_defconfig 15 | make -j8 16 | 17 | echo "Create u-boot image..." 18 | mkimage -n rk3288 -T rksd -d spl/u-boot-spl-dtb.bin $DESTDIR/u-boot/u-boot.img 19 | cat u-boot-dtb.bin >> $DESTDIR/u-boot/u-boot.img 20 | 21 | cd $KERNELDIR 22 | echo "Cleaning kernel folder..." 23 | touch .scmversion 24 | make clean 25 | 26 | echo "Configuring options..." 27 | make tinker-rockchip_defconfig 28 | make menuconfig 29 | cp .config.old arch/arm/configs/tinker-rockchip_defconfig.old 30 | cp .config arch/arm/configs/tinker-rockchip_defconfig 31 | 32 | echo "Compiling the kernel..." 33 | make -j12 34 | 35 | echo "Saving configuration..." 36 | kver=`make kernelrelease`-`date +%Y.%d.%m-%H.%M` 37 | rm $DESTDIR/boot/config* 38 | cp .config $DESTDIR/boot/config-${kver} 39 | cp .config $DESTDIR/config-${kver} 40 | 41 | echo "Saving kernel and dtb's..." 42 | cp arch/arm/boot/zImage $DESTDIR/boot 43 | cp arch/arm/boot/dts/*.dtb $DESTDIR/boot/dtb 44 | 45 | echo "Saving modules and firmware..." 46 | rm -r $DESTDIR/lib 47 | make modules_install ARCH=arm INSTALL_MOD_PATH=$DESTDIR 48 | make firmware_install ARCH=arm INSTALL_FW_PATH=$DESTDIR/lib/firmware 49 | 50 | echo "Saving Volumio kernel patches" 51 | git diff > $DESTDIR/tinkerboard/patches/Volumio-Kernel.patches 52 | 53 | echo "Backup platform files..." 54 | cd $TARDIR 55 | tar cfvJ tinkerboard.tar.xz ./tinkerboard 56 | echo "Creating platform files completed" 57 | -------------------------------------------------------------------------------- /docs/05_Porting_Guide/17_1_How_To_Build_A_Sparky.md: -------------------------------------------------------------------------------- 1 | ## Allo Sparky-build 2 | Scripts to help build an Allo Sparky image 3 | 4 | #### Prerequisites 5 | 6 | ``` 7 | git squashfs-tools kpartx multistrap qemu-user-static samba debootstrap parted dosfstools qemu binfmt-support qemu-utils 8 | ``` 9 | 10 | It is recommended, not a necessity, to use Debian Jessie 8 (as that's what we are building for). 11 | If on Ubuntu, you may need to remove `$forceyes` from line 989 of /usr/sbin/multistrap 12 | 13 | ### How to 14 | #### Prepare 15 | - clone the help scripts repo to $HOME : 16 | git clone http://github.com/gkkpch/sparky-build $HOME/sparky-build 17 | - go to $HOME/sparky-build, type 18 | ``` 19 | ./infrainit.sh 20 | ``` 21 | This will 22 | - clone the sparky kernel repo to $HOME/sparky-linux 23 | - clone the official Volumio 2 build repo to $HOME/volumio-build 24 | - place the default platform-sparky files into the volumio-build folder 25 | 26 | #### Build the platform files 27 | - go to $HOME/sparky-build to start the kernel build, type: 28 | 29 | ``` 30 | ./build-kernel.sh 31 | ``` 32 | In case you don't need kernel config changes, just exit menuconfig. 33 | Otherwise do not forget to save the config (via menu or when prompted). 34 | 35 | #### Build Sparky Image 36 | - goto $HOME/volumio-build and type: 37 | 38 | ``` 39 | sudo ./build.sh -b arm -d sparky -v - 40 | ``` 41 | 42 | You can do it separate, rootfs first and then the image: 43 | 44 | ``` 45 | sudo ./build.sh -b arm 46 | sudo ./build.sh -d sparky -v - 47 | ``` 48 | 49 | Once you built the arm rootfs, there is no need to repeat this (unless volumio has changed). 50 | For subsequent image builds, just do: 51 | 52 | ``` 53 | sudo ./build.sh -d sparky -v - 54 | -------------------------------------------------------------------------------- /docs/05_Porting_Guide/19_Creating_the_image_build_scripts (Part 2).md: -------------------------------------------------------------------------------- 1 | ## Creating the Image Build Script (Part 2) 2 | For the config script we use the corresponding __odroidc1config.sh__ as a template. 3 | This chapter will describe which parts need to be adjusted and for what reason. 4 | For the complete template script see ____ 5 | The resulting tinkerimage.sh can be found [__here__](http://github.com/volumio/Build/scripts/tinkerconfig.sh) 6 | The parts of the C1 template which are not mentioned here are considered generic and unlikely candidates for changes. 7 | ### Creating fstab 8 | Just change the description in line 1. 9 | This part is standard in most implementations we encountered as most devices boot from mmcblk0, independent of SD or eMMC. 10 | That said, this may call for a future change. 11 | Newer devices using mainline u-boot and offering boot from emmc and sd are now using different devices. 12 | This may require the UUID for locating the correct boot device as we do not want to produce separate images for booting from SD or eMMC. 13 | An example implementation "by_UUID" you will find in the x86 build scripts. 14 | ### Adding default sound modules ### 15 | Tinkerboard does not (yet) support i2s devices, so no need to load sound modules. 16 | This may chnage in future releases. 17 | ### init script ### 18 | Tinkerboard is still headless, C1 uses a script to initialise the framebuffer at an early stage (C1-init.sh). 19 | In case Tinkerboard needs this, add it to the tinker init script, which was implemented like this: 20 | 21 | echo "#!/bin/sh 22 | echo 2 > /proc/irq/45/smp_affinity 23 | " > /usr/local/bin/tinker-init.sh 24 | chmod +x /usr/local/bin/tinker-init.sh 25 | 26 | echo "#!/bin/sh -e 27 | /usr/local/bin/tinker-init.sh 28 | exit 0" > /etc/rc.local 29 | Currently, the init script changes the usb interrupt CPU affinity (from CPU0 to CPU1). 30 | This was done to avoid possible crackling and dropouts on usb audio. 31 | The script runs when rc.local is called at boot time. 32 | ### Additional packages ### 33 | lirc is installed, but no specific configuration for a remote is present yet. 34 | It defaults to a small remote Hardkernel offers for the C1/C2. 35 | As no framebuffer initialisation is done, package "fbset" is not needed and removed. 36 | -------------------------------------------------------------------------------- /docs/05_Porting_Guide/img/uart-intfc.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/05_Porting_Guide/img/uart-intfc.jpg -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/00_brutefir/01_Preparing_your_system.md: -------------------------------------------------------------------------------- 1 | ## Preparing Your system 2 | 3 | To start install the plugin following the instructions on the [ : Brutefir Git-hub](https://github.com/balbuze/volumio-plugins/tree/master/plugins/audio_interface/brutefir3) page. Then follow the following instructions: 4 | 5 | 1. Once the plugin is installed, enabled it wait about 20 sec. Don't try to make any change in Volumio playback. 6 | 2. The plugin will prompt you to reboot in order to perform hardware detection. Most of the time, a __reboot__ is required to get good values. 7 | 3. After a reboot try to play a track, if the music is playing, go to the next step. 8 | - If an error occurs go in plugin settings and try to change __Output Format__ and __Sample Rate__. These are DAC dependant parameters. 9 | 4. You can now test with a filter, just select __demo-left.pcm__ and __demo-right.pcm__ in plugin settings: (a few filters to test are installed by the plugin, they are placed in `/data/INTERNAL/Dsp/filters`) and press `Apply`. This can be done while playing. You should hear the difference. 10 | - __Important:__ Applying filters will display a prompt to Test Clipping and set Attenuation. This is done by playing full volume pink noise. If your DAC support a volume mixer, it should be mute. In other case __Turn down your volume before pressing `Test`__ 11 | 12 | ### Now, let's see how to create your own filter, just designed for your hardware and room! 13 | Go to [next page](02_Making_Measurment.md). 14 | 15 | --- 16 | ## Interface screenshots 17 | 18 | __Main Interface of the plugin__ 19 | 20 | 21 | 22 | 23 | __Filter Advanced Settings__ 24 | 25 | 26 | 27 | 28 | __VoBAF settings (optional)__ 29 | 30 | 31 | 32 | 33 | __Filter Creation (described in the following pages)__ 34 | 35 | 36 | 37 | 38 | __Tools (described in the following pages)__ 39 | 40 | -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/00_brutefir/img/VoBAF-settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/00_brutefir/img/VoBAF-settings.png -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/00_brutefir/img/export_impulse.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/00_brutefir/img/export_impulse.jpg -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/00_brutefir/img/filter-creation-menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/00_brutefir/img/filter-creation-menu.png -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/00_brutefir/img/first_filter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/00_brutefir/img/first_filter.png -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/00_brutefir/img/general_plugin_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/00_brutefir/img/general_plugin_settings.png -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/00_brutefir/img/install_tools.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/00_brutefir/img/install_tools.png -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/00_brutefir/img/list_sweep_files.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/00_brutefir/img/list_sweep_files.png -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/00_brutefir/img/make_a_measurment.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/00_brutefir/img/make_a_measurment.jpg -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/00_brutefir/img/preferences_micmeter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/00_brutefir/img/preferences_micmeter.jpg -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/00_brutefir/img/rePhase_import.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/00_brutefir/img/rePhase_import.jpg -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/00_brutefir/img/rephase_import_REW_filter_settings.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/00_brutefir/img/rephase_import_REW_filter_settings.jpg -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/00_brutefir/img/rew1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/00_brutefir/img/rew1.png -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/00_brutefir/img/rew_EQ_window.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/00_brutefir/img/rew_EQ_window.jpg -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/00_brutefir/img/rew_preferences.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/00_brutefir/img/rew_preferences.jpg -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/00_brutefir/img/rew_rta_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/00_brutefir/img/rew_rta_settings.png -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/00_brutefir/img/room-settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/00_brutefir/img/room-settings.png -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/00_brutefir/img/room_settings_values.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/00_brutefir/img/room_settings_values.png -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/00_brutefir/img/select_filter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/00_brutefir/img/select_filter.png -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/00_brutefir/img/sofa_front.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/00_brutefir/img/sofa_front.png -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/00_brutefir/img/sofa_iso.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/00_brutefir/img/sofa_iso.png -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/00_brutefir/img/sofa_top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/00_brutefir/img/sofa_top.png -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/00_brutefir/img/using_filter_in_volumio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/00_brutefir/img/using_filter_in_volumio.png -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/01_rotaryencoder2/02_Device_Tree_Overlays.md: -------------------------------------------------------------------------------- 1 | ## Linux Device Tree Overlay: Rotary Encoder 2 | Even with a perfect signal from RC-filter and Schmitt-trigger, there were still missed ticks sometimes. I could solve that by moving to the DT overlay driver for rotary encoders. 3 | 4 | Raspbian (and Volumio) support it out of the box. If you load the device-tree overlay for a rotary, you no longer need to take care of the Gray-Code and just hook up to a device that will nicely send you information about turns of the rotary encoder (relative or absolute, the plugin only supports relative so far). 5 | 6 | The advantages of the dtoverlay solution: 7 | - Very fast response, due to Kernel level implementation 8 | - Versatile driver for use with all kinds of encoder types 9 | - The dtoverlays can dynamically be loaded and unloaded, so integration was quite straightforward. 10 | 11 | The plugin basically executes calls to dtoverlay for adding and removing overlays: 12 | To add a rotary: 13 | ``` 14 | sudo dtoverlay rotary-encoder pin_a=17 pin_b=27 relative_axis=1 steps-per-period=2 15 | ``` 16 | To remove a rotary: 17 | ``` 18 | sudo dtoverlay -r 19 | ``` 20 | 21 | The plugin is doing this when you change and save settings. You do not need to go to the command line. -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/01_rotaryencoder2/03_Compatible_Encoders.md: -------------------------------------------------------------------------------- 1 | ## List of compatible Rotary Encoders 2 | The list currently lists only the ALPS Encoder I used for my project. I am convinced, that it works with others as well. I found some other projects using dtoverlay that use KY040 for example or other ALPS types. 3 | **_Please add yours to the list to help others. If you do not know how to edit this file in Github, create an issue with the information and I will integrate it someday._** 4 | 5 | |Manufacturer|Model |Periods/Position|HW-Debounce used |Tested by | 6 | |------------|------------|----------------|---------------------|-------------------| 7 | |ALPS |STEC11B03 | 1/2 |RC + Schmitt-Trigger |[7h0mas-R](https://github.com/7h0mas-R) | 8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/01_rotaryencoder2/04_Appendix.md: -------------------------------------------------------------------------------- 1 | ## Potential future extensions 2 | - add the other parameters offered by the dtoverlay (e.g. absolute positioning, binary instead of Gray-code etc.) 3 | - Add support for more than 3 encoders 4 | - Add support for dtoverlays loaded at boot (similar to overlays for I2S DACs) 5 | 6 | ## Known issues and limitations 7 | ### Kernel warning when last overlay is removed 8 | When the plugin is disabled, a kernel warning message about a potential memory leak is displayed when the last overlay is removed. I tried several things to prevent it and posted to several forums looking for help, but could not get rid of it. 9 | I consider it as not nice, but I could also not observe any issue after multiple disable/enable loops - so I decided to keep it as is for the time being. 10 | During normal use, the plugin will be configured once only and then loaded at boot and unloaded at shutdown - so you should never experience an issue. I use it for several months already without issues. 11 | 12 | 13 | ## References 14 | ### Device Tree Documentation 15 | - [Kernel Documentation: rotary-encoder](https://www.kernel.org/doc/Documentation/input/rotary-encoder.txt) 16 | Explains more about how a rotary works and how the DTOverlay is implemented 17 | - [Documentation of the `dtoverlay` command](https://github.com/raspberrypi/firmware/blob/master/boot/overlays/README) 18 | Search for 'rotary-encoder'. Alternatively, you can call 19 | ``` 20 | dtoverlay -h rotary-encoder 21 | ``` 22 | from the command line. 23 | - [Documentation of the Raspberry Device Tree](https://www.raspberrypi.org/documentation/configuration/device-tree.md) 24 | If you would like to learn more about the details of the dtoverlay function. 25 | 26 | ### NPM modules used 27 | - [onoff](https://www.npmjs.com/search?q=onoff) 28 | Since it was easier to implement and does not have any issues, I still use _onoff_ for the push button. This could also be done with _dtoverlay_, but seems too much effort since it does not provide additional performance. 29 | 30 | ### Hardware Resources 31 | - [RPi GPIOs](https://www.raspberrypi.org/documentation/hardware/raspberrypi/gpio/README.md) 32 | 33 | 34 | -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/01_rotaryencoder2/img/RC-Schmitt.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/01_rotaryencoder2/img/RC-Schmitt.jpg -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/01_rotaryencoder2/img/RC-debounced.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/01_rotaryencoder2/img/RC-debounced.jpg -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/01_rotaryencoder2/img/RC-debounced2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/01_rotaryencoder2/img/RC-debounced2.jpg -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/01_rotaryencoder2/img/RC-filter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/01_rotaryencoder2/img/RC-filter.jpg -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/01_rotaryencoder2/img/Schmitt-Trigger.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/01_rotaryencoder2/img/Schmitt-Trigger.jpg -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/01_rotaryencoder2/img/Schmitt-Trigger2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/01_rotaryencoder2/img/Schmitt-Trigger2.jpg -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/01_rotaryencoder2/img/bouncy_rotary.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/01_rotaryencoder2/img/bouncy_rotary.jpg -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/01_rotaryencoder2/img/rotary_types.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/01_rotaryencoder2/img/rotary_types.jpg -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/01_rotaryencoder2/img/settings_en.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/01_rotaryencoder2/img/settings_en.jpg -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/01_rotaryencoder2/img/settings_en.pxm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/01_rotaryencoder2/img/settings_en.pxm -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/01_rotaryencoder2/img/tau_charge.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/01_rotaryencoder2/img/tau_charge.jpg -------------------------------------------------------------------------------- /docs/06_Plugins_User_Manuals/01_rotaryencoder2/img/tau_discharge.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/06_Plugins_User_Manuals/01_rotaryencoder2/img/tau_discharge.jpg -------------------------------------------------------------------------------- /docs/07_Good_to_Knows/02_Mounting_an_NFS_Share.md: -------------------------------------------------------------------------------- 1 | ## Adding Music from a shared folder on a Synology 2 | 3 | The following has been tested on a Synology DS412 in combination with Volumio 0.978 for Raspberry Pi 3. 4 | 5 | Since both Synology and Volumio for Raspberry Pi are Unix based the preference is to use NFS (Network File System) type file sharing. More information about NFS is available [on Wikipedia](https://en.wikipedia.org/wiki/Network_File_System). 6 | 7 | #### Synology preparation 8 | 9 | To enable NFS on Synology follow the [detailed guide from Synology](https://www.synology.com/en-global/knowledgebase/DSM/tutorial/File_Sharing/How_to_access_files_on_Synology_NAS_within_the_local_network_NFS). This guide explains in great detail the steps required. 10 | 11 | The final NFS rule configuration is shown in the following screenshot. The most important part is the `Squash` setting. The required access is `RW` and since it's wise to disable the Guest account on your Synology, the `Squash` setting must be set to `Map all users to admin`. 12 | 13 | Synology NFS configuration panel 14 | 15 | #### Volumio preparation 16 | 17 | - Go to `Settings > My Music` 18 | - Press `+ Add New Drive` 19 | - Make sure you configure the share as shown in the screenshot below. `volume1` is normally the first part of the path, followed by the name of your share (in this case, `Music`) 20 | 21 | Since we are using an NFS share, no username nor password are required. 22 | 23 | Volumio audio sources panel 24 | -------------------------------------------------------------------------------- /docs/07_Good_to_Knows/03_Contribute_to_this_Doc.md: -------------------------------------------------------------------------------- 1 | ## Contribute to this Documentation 2 | 3 | Everyone knows how tedious it is to write documentation. But it is extremely important for every project, especially for Volumio. So if you find something incomplete, missing or 4 | wrong feel free to edit this doc and improve it. 5 | 6 | If you don't feel like editing this doc yourself, you can at least tell us what you would change [here](https://volumio.org/forum/documentation-feedback-t6425.html)! 7 | 8 | #### How this doc works 9 | 10 | This DOC is powered by [DAUX.IO](http://daux.io/) and the source is hosted on the [Github Volumio docs repository](https://github.com/volumio/docs). To edit it, simply clone it, edit the 11 | pages located under /docs and issue a pull request. You can do so either via command line or with a graphical tool, I personally suggest  [GitKraken](https://www.gitkraken.com/). 12 | 13 | 14 | #### Cloning and issuing a Pull request 15 | 16 | 1. Clone it 17 | ```bash 18 | https://github.com/volumio/docs.git 19 | ``` 20 | 21 | 2. Edit it 22 | * I suggest [Atom.io IDE](https://atom.io/) together with [Markdown Preview](https://atom.io/packages/markdown-preview) but any text editor will do 23 | * Make sure you comply with [DAUX rules](http://daux.io/Getting_Started) (if you create a new page, don't use spaces but _ and make sure the name ends with .md) 24 | * This doc is written in Markdown language, and automatically converted to html. See the [Markdown Cheatsheet](../Good_to_Knows/Markdown_Cheatsheet) to get used to it 25 | 26 | 3. Commit it 27 | 28 | ```bash 29 | git commit -m "Hey I changed this and that" 30 | ``` 31 | 32 | 4. Issue a pull request 33 | 34 | 5. Once your PR gets accepted, in 2 minutes your contribution will be available to the whole community. 35 | 36 | 37 | #### See changes live 38 | 39 | To see your changes live, just download and launch any [XAMMP environment](https://www.apachefriends.org/en/index.html) to expose a php-capable local web server, and clone the docs 40 | under your htdocs folder. Docs will update in realtime and will be available under `http://localhost/docs` 41 | 42 | You don't even need XAMMP. 43 | * make your modifications 44 | * in the top level of the project run: 45 | ```bash 46 | $ php generate 47 | ``` 48 | This will generate the documentation in the ```static/``` folder 49 | * in your browser, navigate to ```file:///path/to/doc-clone/static``` 50 | * when you are satisfied, commit the changes 51 | -------------------------------------------------------------------------------- /docs/07_Good_to_Knows/04_Connection_Outside_LAN.md: -------------------------------------------------------------------------------- 1 | ## Connecting from Outside the LAN 2 | 3 | Sometimes it might be useful to connect to Volumio from outside the LAN, via services like NO-IP. Volumio UI uses socket.io to communicate with the backend, so we must tell the UI to connect 4 | to the external IP rather than the LAN's IP. 5 | 6 | #### Tell the UI to bind to new IP 7 | 8 | If you want to achieve this, hardcode your public IP in [https://github.com/volumio/Volumio2/blob/master/http/restapi.js](https://github.com/volumio/Volumio2/blob/master/http/restapi.js) line 49 9 | 10 | ``` 11 | res.json({ host: 'http://'+self.host}); 12 | ``` 13 | 14 | your public ip instead of self.host 15 | -------------------------------------------------------------------------------- /docs/08_FAQs/02_Updating_and_Maintenance.md: -------------------------------------------------------------------------------- 1 | ## Updating & Maintenance 2 | 3 | #### How do I update Volumio? 4 | 5 | Volumio features an OTA (Over The Air) updater, meant to allow a seamless and reliable way to update to new system versions. Please note that if you enable updating to intermediate beta/test versions, you risk making your system unreliable, and may need to carry out a 'factory reset' to the last stable version that you installed. 6 | 7 |

8 | Caution: do not try to update your system by using 'sudo apt-get upgrade' ... this is likely to result in a non-functional system. 9 |

10 | 11 | #### How do I do a 'factory reset?' 12 | 13 | System settings may be returned to the first version that you installed by carrying out a 'factory reset' under 'System Settings.' Note that you will lose all of your settings by applying this option. 14 | 15 | #### How can I backup my settings? 16 | 17 | It is a good idea to have a backup of your settings (NAS, playlists, webradios etc.) and this is easily achieved by use of the 'Backup and Restore' plugin. 18 | -------------------------------------------------------------------------------- /docs/08_FAQs/04_Audio_Output.md: -------------------------------------------------------------------------------- 1 | ## Audio Output 2 | 3 | #### How do I set the audio output from Volumio? 4 | 5 | Select 'Settings', 'Playback Options', and choose your 'Output Device' from the drop down menu. If you are are NOT using an i2s device (for example a USB DAC), then ensure that the 'i2s' switch is in the 'Off' position. Choose the correct DAC model (note that some DAC models use a common driver), and save your settings. Reboot & check that the settings are retained. 6 | 7 | 8 | 9 | #### Why can't I control the volume from the Volumio UI? 10 | 11 | Not all DACs include a hardware volume control (check with your device manufacturer) which allows the changing of volume from the UI. This behaviour can be achieved in such devices by selecting the Mixer Type as 'Software', rather than 'Hardware', BUT please note that this results in a degradation of the sound quality. If this is a problem then select Mixer Type as 'None', and adjust the volume on your amplifier. 12 | 13 | #### Does Volumio support multiroom play? 14 | 15 | Volumio does allow the control of devices in different rooms from a single Volumio UI (if you have more than one device, then they will be visible in the UI). 16 | 17 | 18 | 19 | 20 | Multiroom synchronised play is also possible through the use of a 'Snapcast' plugin. 21 | -------------------------------------------------------------------------------- /docs/08_FAQs/img/audio-output.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/08_FAQs/img/audio-output.jpg -------------------------------------------------------------------------------- /docs/08_FAQs/img/cifs_options.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/08_FAQs/img/cifs_options.jpg -------------------------------------------------------------------------------- /docs/08_FAQs/img/multiroom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/docs/08_FAQs/img/multiroom.png -------------------------------------------------------------------------------- /docs/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Volumio Documentation", 3 | "tagline": "The Audiophile Music Player", 4 | "author": "Michelangelo Guarise", 5 | "image": "images/Volumio_logo.jpg", 6 | "ignore": { 7 | "files": ["Work_In_Progress.md"], 8 | "folders": ["99_Not_Ready"] 9 | }, 10 | "live": { 11 | "inherit_index": true, 12 | "clean_urls": true 13 | }, 14 | "html": { 15 | "theme": "daux-blue", 16 | "template":"default", 17 | "breadcrumbs": false, 18 | "breadcrumb_separator": "Chevrons", 19 | "toggle_code": true, 20 | "date_modified": false, 21 | "float": false, 22 | "auto_landing": false, 23 | 24 | 25 | "twitter": ["volumio"], 26 | "google_analytics": "UA-46374275-1", 27 | "links": { 28 | "Home": "https://volumio.org", 29 | "Download": "https://volumio.org/get-started", 30 | "Forum": "https://volumio.org/forum", 31 | "GitHub Repo": "https://github.com/volumio", 32 | "Improve this documentation": "https://volumio.github.io/docs/Good_to_Knows/Contribute_to_this_Doc.html" 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /generate: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | run(); 78 | -------------------------------------------------------------------------------- /global.json: -------------------------------------------------------------------------------- 1 | { 2 | "docs_directory": "docs", 3 | "themes_directory": "themes", 4 | "title": "My Project", 5 | "tagline": "My Stylish Documentation", 6 | "author": "I, Me & Myself", 7 | "image": "", 8 | "languages": {}, 9 | 10 | "format": "html", 11 | "processor": "", 12 | 13 | "ignore": { 14 | "files": [], 15 | "folders": [] 16 | }, 17 | 18 | "timezone": "America/Los_Angeles", 19 | 20 | "live": { 21 | "inherit_index": false, 22 | "clean_urls": false 23 | }, 24 | 25 | "html": { 26 | "theme": "daux-blue", 27 | "breadcrumbs": false, 28 | "toggle_code": false, 29 | "date_modified": false, 30 | "float": false, 31 | "auto_landing": false, 32 | "search": true, 33 | "auto_toc": false, 34 | 35 | "repo": "", 36 | "twitter": [], 37 | "links": { 38 | }, 39 | 40 | "google_analytics": false, 41 | "piwik_analytics": false, 42 | "piwik_analytics_id": "0" 43 | }, 44 | 45 | "confluence": { 46 | "prefix": "", 47 | "delete": false 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /libs/Config.php: -------------------------------------------------------------------------------- 1 | $value) { 16 | // If the key doesn't exist yet, 17 | // we can simply set it. 18 | if (!array_key_exists($key, $this)) { 19 | $this[$key] = $value; 20 | continue; 21 | } 22 | 23 | // We already know this value exists 24 | // so if we're in conservative mode 25 | // we can skip this key 26 | if ($override === false) { 27 | continue; 28 | } 29 | 30 | // Merge the values only if 31 | // both values are arrays 32 | if (is_array($this[$key]) && is_array($value)) { 33 | $this[$key] = array_replace_recursive($this[$key], $value); 34 | } else { 35 | $this[$key] = $value; 36 | } 37 | } 38 | } 39 | 40 | /** 41 | * Merge an array into the object, ignore already added keys. 42 | * 43 | * @param $newValues 44 | */ 45 | public function conservativeMerge($newValues) 46 | { 47 | $this->merge($newValues, false); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /libs/Console/Application.php: -------------------------------------------------------------------------------- 1 | setArguments(); 46 | 47 | return $inputDefinition; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /libs/Console/RunAction.php: -------------------------------------------------------------------------------- 1 | write($title); 10 | 11 | $length = function_exists("mb_strlen")? mb_strlen($title) : strlen($title); 12 | 13 | // 8 is the length of the label + 2 let it breathe 14 | $padding = $width - $length - 10; 15 | try { 16 | $response = $closure(); 17 | } catch (\Exception $e) { 18 | $output->writeln(str_pad(" ", $padding) . "[ FAIL ]"); 19 | throw $e; 20 | } 21 | $output->writeln(str_pad(" ", $padding) . "[ OK ]"); 22 | 23 | return $response; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /libs/ContentTypes/ContentType.php: -------------------------------------------------------------------------------- 1 | types = array_reverse($types); 18 | } 19 | 20 | /** 21 | * Get all valid content file extensions 22 | * 23 | * @return string[] 24 | */ 25 | public function getContentExtensions() 26 | { 27 | $extensions = []; 28 | foreach ($this->types as $type) { 29 | $extensions = array_merge($extensions, $type->getExtensions()); 30 | } 31 | 32 | return array_unique($extensions); 33 | } 34 | 35 | /** 36 | * Get the ContentType able to handle this node 37 | * 38 | * @param Content $node 39 | * @return ContentType 40 | */ 41 | public function getType(Content $node) 42 | { 43 | $path = $node->getPath() ?: $node->getName(); 44 | $extension = pathinfo($path, PATHINFO_EXTENSION); 45 | 46 | foreach ($this->types as $type) { 47 | if (in_array($extension, $type->getExtensions())) { 48 | return $type; 49 | } 50 | } 51 | 52 | throw new \RuntimeException("no contentType found for $path"); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /libs/ContentTypes/Markdown/CommonMarkConverter.php: -------------------------------------------------------------------------------- 1 | mergeConfig($config); 23 | $environment->addExtension(new TableExtension()); 24 | 25 | // Table of Contents 26 | $environment->addBlockParser(new TableOfContentsParser()); 27 | 28 | $this->extendEnvironment($environment, $config['daux']); 29 | 30 | if (array_key_exists('processor_instance', $config['daux'])) { 31 | $config['daux']['processor_instance']->extendCommonMarkEnvironment($environment); 32 | } 33 | 34 | $this->docParser = new DocParser($environment); 35 | $this->htmlRenderer = new HtmlRenderer($environment); 36 | } 37 | 38 | protected function getLinkRenderer(Environment $environment) 39 | { 40 | return new LinkRenderer($environment->getConfig('daux')); 41 | } 42 | 43 | protected function extendEnvironment(Environment $environment, Config $config) 44 | { 45 | $environment->addInlineRenderer('Link', $this->getLinkRenderer($environment)); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /libs/ContentTypes/Markdown/ContentType.php: -------------------------------------------------------------------------------- 1 | config = $config; 17 | $this->converter = new CommonMarkConverter(['daux' => $config]); 18 | } 19 | 20 | /** 21 | * @return array 22 | */ 23 | public function getExtensions() 24 | { 25 | return ['md', 'markdown']; 26 | } 27 | 28 | public function convert($raw, Content $node) 29 | { 30 | return $this->converter->convertToHtml($raw); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /libs/ContentTypes/Markdown/LinkRenderer.php: -------------------------------------------------------------------------------- 1 | daux = $daux; 22 | } 23 | 24 | /** 25 | * @param string $url 26 | * @return Entry 27 | * @throws Exception 28 | */ 29 | protected function resolveInternalFile($url) 30 | { 31 | $file = DauxHelper::getFile($this->daux['tree'], $url); 32 | if ($file) { 33 | return $file; 34 | } 35 | 36 | $file = DauxHelper::getFile($this->daux['tree'], $url . '.html'); 37 | if ($file) { 38 | return $file; 39 | } 40 | 41 | throw new Exception("Could not locate file '$url'"); 42 | } 43 | 44 | /** 45 | * @param Link $inline 46 | * @param ElementRendererInterface $htmlRenderer 47 | * 48 | * @return HtmlElement 49 | */ 50 | public function render(AbstractInline $inline, ElementRendererInterface $htmlRenderer) 51 | { 52 | // This can't be in the method type as 53 | // the method is an abstract and should 54 | // have the same interface 55 | if (!$inline instanceof Link) { 56 | throw new \RuntimeException( 57 | "Wrong type passed to " . __CLASS__ . "::" . __METHOD__ . 58 | " the expected type was 'League\\CommonMark\\Inline\\Element\\Link' but '" . 59 | get_class($inline) . "' was provided" 60 | ); 61 | } 62 | 63 | $element = parent::render($inline, $htmlRenderer); 64 | 65 | $url = $inline->getUrl(); 66 | if (!empty($url) && $url[0] == '!') { 67 | $file = $this->resolveInternalFile(ltrim($url, "!")); 68 | 69 | $element->setAttribute('href', $this->daux['base_url'] . $file->getUrl()); 70 | } 71 | 72 | return $element; 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /libs/ContentTypes/Markdown/TableOfContents.php: -------------------------------------------------------------------------------- 1 | isIndented()) { 19 | return false; 20 | } 21 | 22 | $previousState = $cursor->saveState(); 23 | $cursor->advanceToFirstNonSpace(); 24 | $fence = $cursor->match('/^\[TOC\]/'); 25 | if (is_null($fence)) { 26 | $cursor->restoreState($previousState); 27 | 28 | return false; 29 | } 30 | 31 | $context->addBlock(new TableOfContents()); 32 | 33 | return true; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /libs/Exception.php: -------------------------------------------------------------------------------- 1 | raw = $content; 12 | } 13 | 14 | public function getContent() 15 | { 16 | return $this->raw->getContent(); 17 | } 18 | 19 | public function getPureContent() 20 | { 21 | return $this->raw->getContent(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /libs/Format/Base/ContentPage.php: -------------------------------------------------------------------------------- 1 | initializePage($title, $content); 29 | } 30 | 31 | public function setFile(Content $file) 32 | { 33 | $this->file = $file; 34 | } 35 | 36 | public function getFile() 37 | { 38 | return $this->file; 39 | } 40 | 41 | public function setParams(Config $params) 42 | { 43 | $this->params = $params; 44 | } 45 | 46 | /** 47 | * @param ContentType $contentType 48 | */ 49 | public function setContentType($contentType) 50 | { 51 | $this->contentType = $contentType; 52 | } 53 | 54 | public function getPureContent() 55 | { 56 | if (!$this->generatedContent) { 57 | $this->generatedContent = $this->contentType->convert($this->content, $this->getFile()); 58 | } 59 | 60 | return $this->generatedContent; 61 | } 62 | 63 | protected function generatePage() 64 | { 65 | return $this->getPureContent(); 66 | } 67 | 68 | public static function fromFile(Content $file, $params, ContentType $contentType) 69 | { 70 | $page = new static($file->getTitle(), $file->getContent()); 71 | $page->setFile($file); 72 | $page->setParams($params); 73 | $page->setContentType($contentType); 74 | 75 | return $page; 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /libs/Format/Base/EmbedImages.php: -------------------------------------------------------------------------------- 1 | tree = $tree; 24 | } 25 | 26 | public function embed($page, Content $file, $callback) 27 | { 28 | return preg_replace_callback( 29 | "/]*src=['\"]([^\"]*)['\"][^>]*>/", 30 | function ($matches) use ($file, $callback) { 31 | 32 | if ($result = $this->findImage($matches[1], $matches[0], $file, $callback)) { 33 | return $result; 34 | } 35 | 36 | return $matches[0]; 37 | }, 38 | $page 39 | ); 40 | } 41 | 42 | private function getAttributes($tag) 43 | { 44 | $dom = new DOMDocument(); 45 | $dom->loadHTML($tag); 46 | 47 | $img = $dom->getElementsByTagName('img')->item(0); 48 | 49 | $attributes = ['align', 'class', 'title', 'style', 'alt', 'height', 'width']; 50 | $used = []; 51 | foreach ($attributes as $attr) { 52 | if ($img->attributes->getNamedItem($attr)) { 53 | $used[$attr] = $img->attributes->getNamedItem($attr)->value; 54 | } 55 | } 56 | 57 | return $used; 58 | } 59 | 60 | private function findImage($src, $tag, Content $file, $callback) 61 | { 62 | //for protocol relative or http requests : keep the original one 63 | if (substr($src, 0, strlen("http")) === "http" || substr($src, 0, strlen("//")) === "//") { 64 | return $src; 65 | } 66 | 67 | //Get the path to the file, relative to the root of the documentation 68 | $url = DauxHelper::getCleanPath(dirname($file->getUrl()) . '/' . $src); 69 | 70 | //Get any file corresponding to the right one 71 | $file = DauxHelper::getFile($this->tree, $url); 72 | 73 | 74 | if ($file === false) { 75 | return false; 76 | } 77 | 78 | $result = $callback($src, $this->getAttributes($tag), $file); 79 | 80 | return $result ?: $src; 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /libs/Format/Base/Generator.php: -------------------------------------------------------------------------------- 1 | file = $filename; 12 | } 13 | 14 | public function getFile() 15 | { 16 | return $this->file; 17 | } 18 | 19 | public function getPureContent() 20 | { 21 | throw new Exception("you should not use this method to show a raw content"); 22 | } 23 | 24 | public function getContent() 25 | { 26 | throw new Exception("you should not use this method to show a raw content"); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /libs/Format/Base/SimplePage.php: -------------------------------------------------------------------------------- 1 | initializePage($title, $content); 12 | } 13 | 14 | public function getPureContent() 15 | { 16 | return $this->content; 17 | } 18 | 19 | public function getContent() 20 | { 21 | if (is_null($this->generated)) { 22 | $this->generated = $this->generatePage(); 23 | } 24 | 25 | return $this->generated; 26 | } 27 | 28 | protected function initializePage($title, $content) 29 | { 30 | $this->title = $title; 31 | $this->content = $content; 32 | } 33 | 34 | protected function generatePage() 35 | { 36 | return $this->content; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /libs/Format/Confluence/ContentPage.php: -------------------------------------------------------------------------------- 1 | params['tree'])) 17 | ->embed( 18 | $content, 19 | $this->file, 20 | function ($src, array $attributes, Raw $file) { 21 | $filename = basename($file->getPath()); 22 | 23 | //Add the attachment for later upload 24 | $this->attachments[$filename] = ['filename' => $filename, 'file' => $file]; 25 | 26 | return $this->createImageTag($filename, $attributes); 27 | } 28 | ); 29 | 30 | 31 | $intro = ''; 32 | if (array_key_exists('confluence', $this->params) && array_key_exists('header', $this->params['confluence']) && !empty($this->params['confluence']['header'])) { 33 | $intro = '' . $this->params['confluence']['header'] . ''; 34 | } 35 | 36 | return $intro . $content; 37 | } 38 | 39 | private function createImageTag($filename, $attributes) 40 | { 41 | $img = " $value) { 44 | $img .= ' ac:' . $name . '="' . htmlentities($value, ENT_QUOTES, 'UTF-8', false) . '"'; 45 | } 46 | 47 | $img .= ">"; 48 | 49 | return $img; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /libs/Format/Confluence/ContentTypes/Markdown/CommonMarkConverter.php: -------------------------------------------------------------------------------- 1 | getConfig('daux')); 11 | } 12 | 13 | protected function extendEnvironment(Environment $environment, Config $config) 14 | { 15 | parent::extendEnvironment($environment, $config); 16 | 17 | $environment->addBlockRenderer('Todaymade\Daux\ContentTypes\Markdown\TableOfContents', new TOCRenderer()); 18 | 19 | //Add code renderer 20 | $environment->addBlockRenderer('FencedCode', new FencedCodeRenderer()); 21 | $environment->addBlockRenderer('IndentedCode', new IndentedCodeRenderer()); 22 | 23 | $environment->addInlineRenderer('Image', new ImageRenderer()); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /libs/Format/Confluence/ContentTypes/Markdown/ContentType.php: -------------------------------------------------------------------------------- 1 | config = $config; 10 | $this->converter = new CommonMarkConverter(['daux' => $config]); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /libs/Format/Confluence/ContentTypes/Markdown/FencedCodeRenderer.php: -------------------------------------------------------------------------------- 1 | 'html/xml', 'xml' => 'html/xml', 'js' => 'javascript']; 38 | 39 | /** 40 | * @param AbstractBlock $block 41 | * @param HtmlRendererInterface $htmlRenderer 42 | * @param bool $inTightList 43 | * 44 | * @return HtmlElement|string 45 | */ 46 | public function render(AbstractBlock $block, ElementRendererInterface $htmlRenderer, $inTightList = false) 47 | { 48 | if (!($block instanceof FencedCode)) { 49 | throw new \InvalidArgumentException('Incompatible block type: ' . get_class($block)); 50 | } 51 | 52 | $content = []; 53 | 54 | if ($language = $this->getLanguage($block->getInfoWords(), $htmlRenderer)) { 55 | $content[] = new HtmlElement('ac:parameter', ['ac:name' => 'language'], $language); 56 | } 57 | 58 | $content[] = new HtmlElement('ac:plain-text-body', [], 'getStringContent() . ']]>'); 59 | 60 | return new HtmlElement( 61 | 'ac:structured-macro', 62 | ['ac:name' => 'code'], 63 | $content 64 | ); 65 | } 66 | 67 | public function getLanguage($infoWords, ElementRendererInterface $htmlRenderer) 68 | { 69 | if (count($infoWords) === 0 || strlen($infoWords[0]) === 0) { 70 | return false; 71 | } 72 | 73 | $language = $htmlRenderer->escape($infoWords[0], true); 74 | 75 | if (array_key_exists($language, $this->known_conversions)) { 76 | $language = $this->known_conversions[$language]; 77 | } 78 | 79 | if (in_array($language, $this->supported_languages)) { 80 | return $language; 81 | } 82 | 83 | return false; 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /libs/Format/Confluence/ContentTypes/Markdown/ImageRenderer.php: -------------------------------------------------------------------------------- 1 | getUrl(), 'http') === 0) { 20 | return new HtmlElement( 21 | 'ac:image', 22 | [], 23 | new HtmlElement('ri:url', ['ri:value' => $inline->getUrl()]) 24 | ); 25 | } 26 | 27 | return parent::render($inline, $htmlRenderer); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /libs/Format/Confluence/ContentTypes/Markdown/IndentedCodeRenderer.php: -------------------------------------------------------------------------------- 1 | 'code'], 27 | new HtmlElement('ac:plain-text-body', [], 'getStringContent() . ']]>') 28 | ); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /libs/Format/Confluence/ContentTypes/Markdown/LinkRenderer.php: -------------------------------------------------------------------------------- 1 | getUrl(); 32 | if (empty($url) || $url[0] != '!') { 33 | return $element; 34 | } 35 | 36 | //Internal links 37 | $file = $this->resolveInternalFile(ltrim($url, "!")); 38 | 39 | $link_props = [ 40 | 'ri:content-title' => trim($this->daux['confluence']['prefix']) . " " . $file->getTitle(), 41 | 'ri:space-key' => $this->daux['confluence']['space_id'] 42 | ]; 43 | 44 | $page = strval(new HtmlElement('ri:page', $link_props, '', true)); 45 | $children = $htmlRenderer->renderInlines($inline->children()); 46 | if (strpos($children, "<") !== false) { 47 | $children = '' . $children . ''; 48 | } else { 49 | $children = ''; 50 | } 51 | 52 | return new HtmlElement('ac:link', [], $page . $children); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /libs/Format/Confluence/ContentTypes/Markdown/TOCRenderer.php: -------------------------------------------------------------------------------- 1 | '; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /libs/Format/Confluence/DuplicateTitleException.php: -------------------------------------------------------------------------------- 1 | addDocumentProcessor(new TOC\Processor($config)); 13 | $environment->addBlockRenderer('Todaymade\Daux\ContentTypes\Markdown\TableOfContents', new TOC\Renderer()); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /libs/Format/HTML/ContentTypes/Markdown/ContentType.php: -------------------------------------------------------------------------------- 1 | config = $config; 10 | $this->converter = new CommonMarkConverter(['daux' => $config]); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /libs/Format/HTML/ContentTypes/Markdown/TOC/Entry.php: -------------------------------------------------------------------------------- 1 | content = $content; 15 | $this->level = $content->getLevel(); 16 | } 17 | 18 | /** 19 | * @return string 20 | */ 21 | public function getId() 22 | { 23 | return $this->content->data['attributes']['id']; 24 | } 25 | 26 | /** 27 | * @return int 28 | */ 29 | public function getLevel() 30 | { 31 | return $this->level; 32 | } 33 | 34 | /** 35 | * @return Entry 36 | */ 37 | public function getParent() 38 | { 39 | return $this->parent; 40 | } 41 | 42 | /** 43 | * @return Heading 44 | */ 45 | public function getContent() 46 | { 47 | return $this->content; 48 | } 49 | 50 | /** 51 | * @return Entry[] 52 | */ 53 | public function getChildren() 54 | { 55 | return $this->children; 56 | } 57 | 58 | /** 59 | * @param Entry $parent 60 | * @param bool $addChild 61 | */ 62 | public function setParent(Entry $parent, $addChild = true) 63 | { 64 | $this->parent = $parent; 65 | if ($addChild) { 66 | $parent->addChild($this); 67 | } 68 | } 69 | 70 | /** 71 | * @param Entry $child 72 | */ 73 | public function addChild(Entry $child) 74 | { 75 | $child->setParent($this, false); 76 | $this->children[] = $child; 77 | } 78 | 79 | public function toString() 80 | { 81 | return $this->getLevel() . " - " . $this->getId(); 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /libs/Format/HTML/ContentTypes/Markdown/TOC/Renderer.php: -------------------------------------------------------------------------------- 1 | renderBlocks($block->children()); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /libs/Format/HTML/ContentTypes/Markdown/TOC/RootEntry.php: -------------------------------------------------------------------------------- 1 | content = null; 8 | $this->level = 0; 9 | } 10 | 11 | /** 12 | * @return Entry 13 | */ 14 | public function getParent() 15 | { 16 | throw new \RuntimeException("No Parent Exception"); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /libs/Format/HTML/RawPage.php: -------------------------------------------------------------------------------- 1 | params['tree'])) 17 | ->embed( 18 | $content, 19 | $this->file, 20 | function ($src, array $attributes, Raw $file) { 21 | 22 | $content = base64_encode(file_get_contents($file->getPath())); 23 | $attr = ''; 24 | foreach ($attributes as $name => $value) { 25 | $attr .= ' ' .$name . '="' . htmlentities($value, ENT_QUOTES, 'UTF-8', false) . '"'; 26 | } 27 | 28 | return ""; 29 | } 30 | ); 31 | 32 | return $content; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /libs/GeneratorHelper.php: -------------------------------------------------------------------------------- 1 | getFilename() === '.' || $file->getFilename() === '..') { 37 | continue; 38 | } 39 | if ($file->isDir()) { 40 | rmdir($file->getRealPath()); 41 | } else { 42 | unlink($file->getRealPath()); 43 | } 44 | } 45 | } 46 | 47 | /** 48 | * Copy files recursively 49 | * 50 | * @param string $source 51 | * @param string $destination 52 | */ 53 | public static function copyRecursive($source, $destination) 54 | { 55 | if (!is_dir($destination)) { 56 | mkdir($destination); 57 | } 58 | 59 | $dir = opendir($source); 60 | while (false !== ($file = readdir($dir))) { 61 | if ($file != '.' && $file != '..') { 62 | if (is_dir($source . DIRECTORY_SEPARATOR . $file)) { 63 | static::copyRecursive( 64 | $source . DIRECTORY_SEPARATOR . $file, 65 | $destination . DIRECTORY_SEPARATOR . $file 66 | ); 67 | } else { 68 | copy($source . DIRECTORY_SEPARATOR . $file, $destination . DIRECTORY_SEPARATOR . $file); 69 | } 70 | } 71 | } 72 | closedir($dir); 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /libs/Processor.php: -------------------------------------------------------------------------------- 1 | daux = $daux; 32 | $this->output = $output; 33 | $this->width = $width; 34 | } 35 | 36 | /** 37 | * With this connection point, you can transform 38 | * the tree as you want, move pages, modify 39 | * pages and even add new ones. 40 | * 41 | * @param Root $root 42 | */ 43 | public function manipulateTree(Root $root) 44 | { 45 | } 46 | 47 | /** 48 | * This connection point provides 49 | * a way to extend the Markdown 50 | * parser and renderer. 51 | * 52 | * @param Environment $environment 53 | */ 54 | public function extendCommonMarkEnvironment(Environment $environment) 55 | { 56 | } 57 | 58 | /** 59 | * Provide new generators with this extension point. You 60 | * can simply return an array, the key is the format's 61 | * name, the value is a class name implementing the 62 | * `Todaymade\Daux\Format\Base\Generator` contract. 63 | * You can also replace base generators. 64 | * 65 | * @return string[] 66 | */ 67 | public function addGenerators() 68 | { 69 | return []; 70 | } 71 | 72 | /** 73 | * Provide new content Types to be used during the generation 74 | * phase, with this you can change the markdown parser or add 75 | * a completely different file type. 76 | * 77 | * @return \Todaymade\Daux\ContentTypes\ContentType[] 78 | */ 79 | public function addContentType() 80 | { 81 | return []; 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /libs/Server/ErrorPage.php: -------------------------------------------------------------------------------- 1 | params = $params; 26 | } 27 | 28 | /** 29 | * @return string 30 | */ 31 | protected function generatePage() 32 | { 33 | $params = $this->params; 34 | $page = [ 35 | 'title' => $this->title, 36 | 'content' => $this->getPureContent(), 37 | 'language' => '', 38 | ]; 39 | 40 | $template = new Template($params['templates'], $params['theme']['templates']); 41 | return $template->render('error', ['page' => $page, 'params' => $params]); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /libs/Server/NotFoundException.php: -------------------------------------------------------------------------------- 1 | content; 14 | } 15 | 16 | /** 17 | * @param string $content 18 | */ 19 | public function setContent($content) 20 | { 21 | $this->content = $content; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /libs/Tree/Raw.php: -------------------------------------------------------------------------------- 1 | setConfig($config); 18 | 19 | $this->setUri($uri); 20 | $this->path = $uri; 21 | } 22 | 23 | /** 24 | * @return Config 25 | */ 26 | public function getConfig() 27 | { 28 | return $this->config; 29 | } 30 | 31 | /** 32 | * @param Config $config 33 | */ 34 | public function setConfig($config) 35 | { 36 | $this->config = $config; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /logb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/logb -------------------------------------------------------------------------------- /logu: -------------------------------------------------------------------------------- 1 | balbuze balbuze@gmail.com 2 | balbuze balbuze@users.noreply.github.com 3 | biva biva@users.noreply.github.com 4 | crisp00 cristian@pintea.net 5 | Cris Pintea cristian@pintea.net 6 | Gé Koerkamp ge.koerkamp@gmail.com 7 | ghembs ggambacorta88@gmail.com 8 | Ghembs ggambacorta88@gmail.com 9 | Gianpaolo Macario gmacario@gmail.com 10 | GitHub noreply@github.com 11 | Ian Sutherland i.m.sutherland@softhome.net 12 | Joel Takvorian joel.takvorian@qaraywa.net 13 | luckynrslevin luckynrslevin@users.noreply.github.com 14 | macmpi spam@ipik.org 15 | Marcus Götling marcus@gotling.se 16 | Michelangelo Guarise job@Mac-mini-di-Michelangelo.local 17 | Michiel Fokke michiel@fokke.org 18 | Rachid Groeneveld Saiyato@users.noreply.github.com 19 | Rob Campbell 27976+robcee@users.noreply.github.com 20 | sla89 skullsplitter@die-optimisten.net 21 | Vincent McIntyre vincent.mcintyre@gmail.com 22 | volumio info@volumio.org 23 | Volumio info@volumio.org 24 | Xipmix xipmix@users.noreply.github.com 25 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "daux.io", 3 | "version": "0.1.1", 4 | "private": true, 5 | "devDependencies": { 6 | "cssnano": "^3.5.2", 7 | "grunt": "^1.0.3", 8 | "grunt-php": "^1.0.0", 9 | "gulp": "^4.0.0", 10 | "gulp-connect-php": "^0.0.7", 11 | "gulp-less": "^4.0.1", 12 | "gulp-plumber": "^1.1.0", 13 | "gulp-postcss": "^6.1.0", 14 | "gulp-rename": "^1.2.2", 15 | "gulp-sourcemaps": "^2.0.0-alpha", 16 | "gulp-stylelint": "^8.0.0", 17 | "stylelint-config-standard": "^6.0.0" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | 15 | ./tests/ 16 | 17 | 18 | 19 | 20 | 21 | libs 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /serve: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | php -S 0.0.0.0:8085 index.php 4 | -------------------------------------------------------------------------------- /templates/content.php: -------------------------------------------------------------------------------- 1 | layout('theme::layout/05_page') ?> 2 |
3 | 4 | 13 | 14 | 17 | 18 | 19 | 20 | 21 | 22 | 28 | 29 |
30 | 31 | -------------------------------------------------------------------------------- /templates/error.php: -------------------------------------------------------------------------------- 1 | layout('theme::layout/05_page') ?> 2 | 3 |
4 | 7 | 8 | 9 |
10 | -------------------------------------------------------------------------------- /templates/partials/google_analytics.php: -------------------------------------------------------------------------------- 1 | 10 | -------------------------------------------------------------------------------- /templates/partials/navbar_content.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | -------------------------------------------------------------------------------- /templates/partials/piwik_analytics.php: -------------------------------------------------------------------------------- 1 | 2 | 16 | -------------------------------------------------------------------------------- /tests/Format/Confluence/ApiTest.php: -------------------------------------------------------------------------------- 1 | assertEquals("test.com", $api->getClient()->getConfig()['base_uri']->getHost()); 11 | } 12 | } -------------------------------------------------------------------------------- /tests/Tree/ContentTest.php: -------------------------------------------------------------------------------- 1 | setContent($content); 11 | 12 | return $obj; 13 | } 14 | 15 | public function providerTestAttributes() 16 | { 17 | return array( 18 | ['This is content', [], "This is content"], 19 | ["title: This is a simple title\n---\nThis is content\n", ['title' => 'This is a simple title'], "This is content"], 20 | ["title: This is a simple title\ntitle :This is another title\n---\nThis is content\n", ['title' => 'This is another title'], "This is content"], 21 | ["title: This is a simple title\nthis is not metadata\n---\nThis is content\n", ['title' => 'This is a simple title'], "This is content"], 22 | ["title: This is only metatada, no content", [], "title: This is only metatada, no content"], 23 | ["title: This is almost only metadata\n---\n", ["title" => "This is almost only metadata"], ""], 24 | ["# Some content\n\nhi\n```yml\nvalue: true\n```\n----\n Follow up", [], "# Some content\n\nhi\n```yml\nvalue: true\n```\n----\n Follow up"], 25 | ); 26 | } 27 | 28 | /** 29 | * @dataProvider providerTestAttributes 30 | */ 31 | public function testAttributes($content, $attributes, $finalContent) 32 | { 33 | $obj = $this->createContent($content); 34 | 35 | $this->assertEquals($attributes, $obj->getAttribute()); 36 | $this->assertEquals($finalContent, trim($obj->getContent())); 37 | } 38 | 39 | public function testNoAttributes() 40 | { 41 | $content = "This is a content with a separator\n----\n this wasn't an attribute"; 42 | 43 | $obj = $this->createContent($content); 44 | 45 | $this->assertEquals($content, $obj->getContent()); 46 | } 47 | 48 | public function testContentPreserved() 49 | { 50 | $content = "this was an attribute, but also a separator\n----\nand it works"; 51 | $with_attribute = "title: a title\n----\n$content"; 52 | 53 | $obj = $this->createContent($with_attribute); 54 | 55 | $this->assertEquals($content, $obj->getContent()); 56 | $this->assertEquals('a title', $obj->getAttribute('title')); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /tests/Tree/DirectoryTest.php: -------------------------------------------------------------------------------- 1 | setName($value); 36 | } 37 | 38 | $directory->sort(); 39 | 40 | $final = []; 41 | foreach ($directory->getEntries() as $obj) { 42 | $final[] = $obj->getName(); 43 | } 44 | 45 | $this->assertEquals($expected, $final); 46 | } 47 | 48 | 49 | } 50 | -------------------------------------------------------------------------------- /themes/daux/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "favicon": "img/favicon.png", 3 | "css": ["css/theme.min.css"], 4 | "fonts": ["//fonts.googleapis.com/css?family=Roboto+Slab:400,100,300,700&subset=latin,cyrillic-ext,cyrillic"], 5 | "js": [], 6 | "variants": { 7 | "blue": { 8 | "favicon": "img/favicon.png", 9 | "css": ["css/volumiodocs.min.css"] 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /themes/daux/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/themes/daux/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /themes/daux/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/themes/daux/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /themes/daux/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/themes/daux/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /themes/daux/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/themes/daux/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /themes/daux/img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/volumio/docs/3232d19b70c6c0f3dd8b65bc3f5b03b659d9c633/themes/daux/img/favicon.png -------------------------------------------------------------------------------- /themes/daux/less/_mixins.less: -------------------------------------------------------------------------------- 1 | /* =========================================================================================== 2 | Mixins 3 | ============================================================================================== */ 4 | 5 | .kill-background-image() { 6 | background-image: none; 7 | filter: none; 8 | } 9 | 10 | .kill-box-shadow() { 11 | box-shadow: none; 12 | } 13 | 14 | .sans-serif(@weight: normal, @size: 14px, @lineheight: 20px) { 15 | font-weight: @weight; 16 | font-size: @size; 17 | font-family: @font-family-sans-serif; 18 | line-height: @lineheight; 19 | } 20 | -------------------------------------------------------------------------------- /themes/daux/less/theme-base.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * DAUX.IO 3 | * http://daux.io/ 4 | * MIT License 5 | */ 6 | 7 | // Daux Style 8 | @import "_mixins.less"; 9 | @import "_typography.less"; 10 | @import "_structure.less"; 11 | @import "_components.less"; 12 | @import "vendor/highlight.less"; 13 | -------------------------------------------------------------------------------- /themes/daux/less/theme-blue.less: -------------------------------------------------------------------------------- 1 | //Daux.io Blue 2 | @sidebar-background: #f7f7f7; 3 | @sidebar-hover: #c5c5cb; 4 | @lines: #e7e7e9; 5 | @dark: #3f4657; 6 | @light: #82becd; 7 | @text: #2d2d2d; 8 | 9 | // Bootstrap 10 | @import "vendor/bootstrap/variables.less"; 11 | @import "vendor/bootstrap/mixins.less"; 12 | @icon-font-path: "../../daux/fonts/"; 13 | 14 | // Daux.io Base 15 | @import "theme-base.less"; 16 | -------------------------------------------------------------------------------- /themes/daux/less/theme-green.less: -------------------------------------------------------------------------------- 1 | //Daux.io Green 2 | @sidebar-background: #f5f5f6; 3 | @sidebar-hover: #a0d55d; 4 | @lines: #e7e7e9; 5 | @dark: #000; 6 | @light: #8acc37; 7 | @text: #2d2d2d; 8 | 9 | // Bootstrap 10 | @import "vendor/bootstrap/variables.less"; 11 | @import "vendor/bootstrap/mixins.less"; 12 | @icon-font-path: "../../daux/fonts/"; 13 | 14 | // Daux.io Base 15 | @import "theme-base.less"; 16 | -------------------------------------------------------------------------------- /themes/daux/less/theme-navy.less: -------------------------------------------------------------------------------- 1 | //Daux.io Navy 2 | @sidebar-hover: #c5c5cb; 3 | @lines: #e7e7e9; 4 | @sidebar-background: #f5f5f6; 5 | @dark: #13132a; 6 | @light: #7795b4; 7 | @text: #2d2d2d; 8 | 9 | // Bootstrap 10 | @import "vendor/bootstrap/variables.less"; 11 | @import "vendor/bootstrap/mixins.less"; 12 | @icon-font-path: "../../daux/fonts/"; 13 | 14 | // Daux.io Base 15 | @import "theme-base.less"; 16 | -------------------------------------------------------------------------------- /themes/daux/less/theme-red.less: -------------------------------------------------------------------------------- 1 | // Daux.io Red 2 | @sidebar-hover: #eee; 3 | @lines: #eee; 4 | @sidebar-background: #f7f7f7; 5 | @dark: #c64641; //#df4f49; 6 | @light: #ecb5a1; 7 | @text: #2d2d2d; 8 | 9 | // Bootstrap 10 | @import "vendor/bootstrap/variables.less"; 11 | @import "vendor/bootstrap/mixins.less"; 12 | @icon-font-path: "../../daux/fonts/"; 13 | 14 | // Daux.io Base 15 | @import "theme-base.less"; 16 | -------------------------------------------------------------------------------- /themes/daux/less/theme.less: -------------------------------------------------------------------------------- 1 | // Bootstrap 2 | @import "vendor/bootstrap/bootstrap.less"; 3 | 4 | @icon-font-path: "../fonts/"; 5 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/alerts.less: -------------------------------------------------------------------------------- 1 | // 2 | // Alerts 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base styles 7 | // ------------------------- 8 | 9 | .alert { 10 | padding: @alert-padding; 11 | margin-bottom: @line-height-computed; 12 | border: 1px solid transparent; 13 | border-radius: @alert-border-radius; 14 | 15 | // Headings for larger alerts 16 | h4 { 17 | margin-top: 0; 18 | // Specified for the h4 to prevent conflicts of changing @headings-color 19 | color: inherit; 20 | } 21 | // Provide class for links that match alerts 22 | .alert-link { 23 | font-weight: @alert-link-font-weight; 24 | } 25 | 26 | // Improve alignment and spacing of inner content 27 | > p, 28 | > ul { 29 | margin-bottom: 0; 30 | } 31 | > p + p { 32 | margin-top: 5px; 33 | } 34 | } 35 | 36 | // Dismissible alerts 37 | // 38 | // Expand the right padding and account for the close button's positioning. 39 | 40 | .alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0. 41 | .alert-dismissible { 42 | padding-right: (@alert-padding + 20); 43 | 44 | // Adjust close link position 45 | .close { 46 | position: relative; 47 | top: -2px; 48 | right: -21px; 49 | color: inherit; 50 | } 51 | } 52 | 53 | // Alternate styles 54 | // 55 | // Generate contextual modifier classes for colorizing the alert. 56 | 57 | .alert-success { 58 | .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text); 59 | } 60 | .alert-info { 61 | .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text); 62 | } 63 | .alert-warning { 64 | .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text); 65 | } 66 | .alert-danger { 67 | .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text); 68 | } 69 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/badges.less: -------------------------------------------------------------------------------- 1 | // 2 | // Badges 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base class 7 | .badge { 8 | display: inline-block; 9 | min-width: 10px; 10 | padding: 3px 7px; 11 | font-size: @font-size-small; 12 | font-weight: @badge-font-weight; 13 | color: @badge-color; 14 | line-height: @badge-line-height; 15 | vertical-align: middle; 16 | white-space: nowrap; 17 | text-align: center; 18 | background-color: @badge-bg; 19 | border-radius: @badge-border-radius; 20 | 21 | // Empty badges collapse automatically (not available in IE8) 22 | &:empty { 23 | display: none; 24 | } 25 | 26 | // Quick fix for badges in buttons 27 | .btn & { 28 | position: relative; 29 | top: -1px; 30 | } 31 | 32 | .btn-xs &, 33 | .btn-group-xs > .btn & { 34 | top: 0; 35 | padding: 1px 5px; 36 | } 37 | 38 | // Hover state, but only for links 39 | a& { 40 | &:hover, 41 | &:focus { 42 | color: @badge-link-hover-color; 43 | text-decoration: none; 44 | cursor: pointer; 45 | } 46 | } 47 | 48 | // Account for badges in navs 49 | .list-group-item.active > &, 50 | .nav-pills > .active > a > & { 51 | color: @badge-active-color; 52 | background-color: @badge-active-bg; 53 | } 54 | 55 | .list-group-item > & { 56 | float: right; 57 | } 58 | 59 | .list-group-item > & + & { 60 | margin-right: 5px; 61 | } 62 | 63 | .nav-pills > li > a > & { 64 | margin-left: 3px; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/bootstrap.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.5 (http://getbootstrap.com) 3 | * Copyright 2011-2015 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | 7 | // Core variables and mixins 8 | @import "variables.less"; 9 | @import "mixins.less"; 10 | 11 | // Reset and dependencies 12 | @import "normalize.less"; 13 | @import "print.less"; 14 | @import "glyphicons.less"; 15 | 16 | // Core CSS 17 | @import "scaffolding.less"; 18 | @import "type.less"; 19 | @import "code.less"; 20 | @import "grid.less"; 21 | //@import "tables.less"; 22 | @import "forms.less"; 23 | @import "buttons.less"; 24 | 25 | // Components 26 | //@import "component-animations.less"; 27 | //@import "dropdowns.less"; 28 | @import "button-groups.less"; 29 | //@import "input-groups.less"; 30 | @import "navs.less"; 31 | @import "navbar.less"; 32 | //@import "breadcrumbs.less"; 33 | //@import "pagination.less"; 34 | @import "pager.less"; 35 | //@import "labels.less"; 36 | //@import "badges.less"; 37 | //@import "jumbotron.less"; 38 | //@import "thumbnails.less"; 39 | //@import "alerts.less"; 40 | //@import "progress-bars.less"; 41 | //@import "media.less"; 42 | //@import "list-group.less"; 43 | //@import "panels.less"; 44 | //@import "responsive-embed.less"; 45 | //@import "wells.less"; 46 | //@import "close.less"; 47 | 48 | // Components w/ JavaScript 49 | //@import "modals.less"; 50 | //@import "tooltip.less"; 51 | //@import "popovers.less"; 52 | //@import "carousel.less"; 53 | 54 | // Utility classes 55 | @import "utilities.less"; 56 | @import "responsive-utilities.less"; 57 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/breadcrumbs.less: -------------------------------------------------------------------------------- 1 | // 2 | // Breadcrumbs 3 | // -------------------------------------------------- 4 | 5 | 6 | .breadcrumb { 7 | padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal; 8 | margin-bottom: @line-height-computed; 9 | list-style: none; 10 | background-color: @breadcrumb-bg; 11 | border-radius: @border-radius-base; 12 | 13 | > li { 14 | display: inline-block; 15 | 16 | + li:before { 17 | content: "@{breadcrumb-separator}\00a0"; // Unicode space added since inline-block means non-collapsing white-space 18 | padding: 0 5px; 19 | color: @breadcrumb-color; 20 | } 21 | } 22 | 23 | > .active { 24 | color: @breadcrumb-active-color; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/close.less: -------------------------------------------------------------------------------- 1 | // 2 | // Close icons 3 | // -------------------------------------------------- 4 | 5 | 6 | .close { 7 | float: right; 8 | font-size: (@font-size-base * 1.5); 9 | font-weight: @close-font-weight; 10 | line-height: 1; 11 | color: @close-color; 12 | text-shadow: @close-text-shadow; 13 | .opacity(.2); 14 | 15 | &:hover, 16 | &:focus { 17 | color: @close-color; 18 | text-decoration: none; 19 | cursor: pointer; 20 | .opacity(.5); 21 | } 22 | 23 | // Additional properties for button version 24 | // iOS requires the button element instead of an anchor tag. 25 | // If you want the anchor version, it requires `href="#"`. 26 | // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile 27 | button& { 28 | padding: 0; 29 | cursor: pointer; 30 | background: transparent; 31 | border: 0; 32 | -webkit-appearance: none; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/code.less: -------------------------------------------------------------------------------- 1 | // 2 | // Code (inline and block) 3 | // -------------------------------------------------- 4 | 5 | 6 | // Inline and block code styles 7 | code, 8 | kbd, 9 | pre, 10 | samp { 11 | font-family: @font-family-monospace; 12 | } 13 | 14 | // Inline code 15 | code { 16 | padding: 2px 4px; 17 | font-size: 90%; 18 | color: @code-color; 19 | background-color: @code-bg; 20 | border-radius: @border-radius-base; 21 | } 22 | 23 | // User input typically entered via keyboard 24 | kbd { 25 | padding: 2px 4px; 26 | font-size: 90%; 27 | color: @kbd-color; 28 | background-color: @kbd-bg; 29 | border-radius: @border-radius-small; 30 | box-shadow: inset 0 -1px 0 rgba(0,0,0,.25); 31 | 32 | kbd { 33 | padding: 0; 34 | font-size: 100%; 35 | font-weight: bold; 36 | box-shadow: none; 37 | } 38 | } 39 | 40 | // Blocks of code 41 | pre { 42 | display: block; 43 | padding: ((@line-height-computed - 1) / 2); 44 | margin: 0 0 (@line-height-computed / 2); 45 | font-size: (@font-size-base - 1); // 14px to 13px 46 | line-height: @line-height-base; 47 | word-break: break-all; 48 | word-wrap: break-word; 49 | color: @pre-color; 50 | background-color: @pre-bg; 51 | border: 1px solid @pre-border-color; 52 | border-radius: @border-radius-base; 53 | 54 | // Account for some code outputs that place code tags in pre tags 55 | code { 56 | padding: 0; 57 | font-size: inherit; 58 | color: inherit; 59 | white-space: pre-wrap; 60 | background-color: transparent; 61 | border-radius: 0; 62 | } 63 | } 64 | 65 | // Enable scrollable blocks of code 66 | .pre-scrollable { 67 | max-height: @pre-scrollable-max-height; 68 | overflow-y: scroll; 69 | } 70 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/component-animations.less: -------------------------------------------------------------------------------- 1 | // 2 | // Component animations 3 | // -------------------------------------------------- 4 | 5 | // Heads up! 6 | // 7 | // We don't use the `.opacity()` mixin here since it causes a bug with text 8 | // fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552. 9 | 10 | .fade { 11 | opacity: 0; 12 | .transition(opacity .15s linear); 13 | &.in { 14 | opacity: 1; 15 | } 16 | } 17 | 18 | .collapse { 19 | display: none; 20 | 21 | &.in { display: block; } 22 | tr&.in { display: table-row; } 23 | tbody&.in { display: table-row-group; } 24 | } 25 | 26 | .collapsing { 27 | position: relative; 28 | height: 0; 29 | overflow: hidden; 30 | .transition-property(~"height, visibility"); 31 | .transition-duration(.35s); 32 | .transition-timing-function(ease); 33 | } 34 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/grid.less: -------------------------------------------------------------------------------- 1 | // 2 | // Grid system 3 | // -------------------------------------------------- 4 | 5 | 6 | // Container widths 7 | // 8 | // Set the container width, and override it for fixed navbars in media queries. 9 | 10 | .container { 11 | .container-fixed(); 12 | 13 | @media (min-width: @screen-sm-min) { 14 | width: @container-sm; 15 | } 16 | @media (min-width: @screen-md-min) { 17 | width: @container-md; 18 | } 19 | @media (min-width: @screen-lg-min) { 20 | width: @container-lg; 21 | } 22 | } 23 | 24 | 25 | // Fluid container 26 | // 27 | // Utilizes the mixin meant for fixed width containers, but without any defined 28 | // width for fluid, full width layouts. 29 | 30 | .container-fluid { 31 | .container-fixed(); 32 | } 33 | 34 | 35 | // Row 36 | // 37 | // Rows contain and clear the floats of your columns. 38 | 39 | .row { 40 | .make-row(); 41 | } 42 | 43 | 44 | // Columns 45 | // 46 | // Common styles for small and large grid columns 47 | 48 | .make-grid-columns(); 49 | 50 | 51 | // Extra small grid 52 | // 53 | // Columns, offsets, pushes, and pulls for extra small devices like 54 | // smartphones. 55 | 56 | .make-grid(xs); 57 | 58 | 59 | // Small grid 60 | // 61 | // Columns, offsets, pushes, and pulls for the small device range, from phones 62 | // to tablets. 63 | 64 | @media (min-width: @screen-sm-min) { 65 | .make-grid(sm); 66 | } 67 | 68 | 69 | // Medium grid 70 | // 71 | // Columns, offsets, pushes, and pulls for the desktop device range. 72 | 73 | @media (min-width: @screen-md-min) { 74 | .make-grid(md); 75 | } 76 | 77 | 78 | // Large grid 79 | // 80 | // Columns, offsets, pushes, and pulls for the large desktop device range. 81 | 82 | @media (min-width: @screen-lg-min) { 83 | .make-grid(lg); 84 | } 85 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/jumbotron.less: -------------------------------------------------------------------------------- 1 | // 2 | // Jumbotron 3 | // -------------------------------------------------- 4 | 5 | 6 | .jumbotron { 7 | padding-top: @jumbotron-padding; 8 | padding-bottom: @jumbotron-padding; 9 | margin-bottom: @jumbotron-padding; 10 | color: @jumbotron-color; 11 | background-color: @jumbotron-bg; 12 | 13 | h1, 14 | .h1 { 15 | color: @jumbotron-heading-color; 16 | } 17 | 18 | p { 19 | margin-bottom: (@jumbotron-padding / 2); 20 | font-size: @jumbotron-font-size; 21 | font-weight: 200; 22 | } 23 | 24 | > hr { 25 | border-top-color: darken(@jumbotron-bg, 10%); 26 | } 27 | 28 | .container &, 29 | .container-fluid & { 30 | border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container 31 | } 32 | 33 | .container { 34 | max-width: 100%; 35 | } 36 | 37 | @media screen and (min-width: @screen-sm-min) { 38 | padding-top: (@jumbotron-padding * 1.6); 39 | padding-bottom: (@jumbotron-padding * 1.6); 40 | 41 | .container &, 42 | .container-fluid & { 43 | padding-left: (@jumbotron-padding * 2); 44 | padding-right: (@jumbotron-padding * 2); 45 | } 46 | 47 | h1, 48 | .h1 { 49 | font-size: @jumbotron-heading-font-size; 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/labels.less: -------------------------------------------------------------------------------- 1 | // 2 | // Labels 3 | // -------------------------------------------------- 4 | 5 | .label { 6 | display: inline; 7 | padding: .2em .6em .3em; 8 | font-size: 75%; 9 | font-weight: bold; 10 | line-height: 1; 11 | color: @label-color; 12 | text-align: center; 13 | white-space: nowrap; 14 | vertical-align: baseline; 15 | border-radius: .25em; 16 | 17 | // Add hover effects, but only for links 18 | a& { 19 | &:hover, 20 | &:focus { 21 | color: @label-link-hover-color; 22 | text-decoration: none; 23 | cursor: pointer; 24 | } 25 | } 26 | 27 | // Empty labels collapse automatically (not available in IE8) 28 | &:empty { 29 | display: none; 30 | } 31 | 32 | // Quick fix for labels in buttons 33 | .btn & { 34 | position: relative; 35 | top: -1px; 36 | } 37 | } 38 | 39 | // Colors 40 | // Contextual variations (linked labels get darker on :hover) 41 | 42 | .label-default { 43 | .label-variant(@label-default-bg); 44 | } 45 | 46 | .label-primary { 47 | .label-variant(@label-primary-bg); 48 | } 49 | 50 | .label-success { 51 | .label-variant(@label-success-bg); 52 | } 53 | 54 | .label-info { 55 | .label-variant(@label-info-bg); 56 | } 57 | 58 | .label-warning { 59 | .label-variant(@label-warning-bg); 60 | } 61 | 62 | .label-danger { 63 | .label-variant(@label-danger-bg); 64 | } 65 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/media.less: -------------------------------------------------------------------------------- 1 | .media { 2 | // Proper spacing between instances of .media 3 | margin-top: 15px; 4 | 5 | &:first-child { 6 | margin-top: 0; 7 | } 8 | } 9 | 10 | .media, 11 | .media-body { 12 | zoom: 1; 13 | overflow: hidden; 14 | } 15 | 16 | .media-body { 17 | width: 10000px; 18 | } 19 | 20 | .media-object { 21 | display: block; 22 | 23 | // Fix collapse in webkit from max-width: 100% and display: table-cell. 24 | &.img-thumbnail { 25 | max-width: none; 26 | } 27 | } 28 | 29 | .media-right, 30 | .media > .pull-right { 31 | padding-left: 10px; 32 | } 33 | 34 | .media-left, 35 | .media > .pull-left { 36 | padding-right: 10px; 37 | } 38 | 39 | .media-left, 40 | .media-right, 41 | .media-body { 42 | display: table-cell; 43 | vertical-align: top; 44 | } 45 | 46 | .media-middle { 47 | vertical-align: middle; 48 | } 49 | 50 | .media-bottom { 51 | vertical-align: bottom; 52 | } 53 | 54 | // Reset margins on headings for tighter default spacing 55 | .media-heading { 56 | margin-top: 0; 57 | margin-bottom: 5px; 58 | } 59 | 60 | // Media list variation 61 | // 62 | // Undo default ul/ol styles 63 | .media-list { 64 | padding-left: 0; 65 | list-style: none; 66 | } 67 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/mixins.less: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------------------------------- 3 | 4 | // Utilities 5 | @import "mixins/hide-text.less"; 6 | @import "mixins/opacity.less"; 7 | @import "mixins/image.less"; 8 | @import "mixins/labels.less"; 9 | @import "mixins/reset-filter.less"; 10 | @import "mixins/resize.less"; 11 | @import "mixins/responsive-visibility.less"; 12 | @import "mixins/size.less"; 13 | @import "mixins/tab-focus.less"; 14 | @import "mixins/reset-text.less"; 15 | @import "mixins/text-emphasis.less"; 16 | @import "mixins/text-overflow.less"; 17 | @import "mixins/vendor-prefixes.less"; 18 | 19 | // Components 20 | @import "mixins/alerts.less"; 21 | @import "mixins/buttons.less"; 22 | @import "mixins/panels.less"; 23 | @import "mixins/pagination.less"; 24 | @import "mixins/list-group.less"; 25 | @import "mixins/nav-divider.less"; 26 | @import "mixins/forms.less"; 27 | @import "mixins/progress-bar.less"; 28 | @import "mixins/table-row.less"; 29 | 30 | // Skins 31 | @import "mixins/background-variant.less"; 32 | @import "mixins/border-radius.less"; 33 | @import "mixins/gradients.less"; 34 | 35 | // Layout 36 | @import "mixins/clearfix.less"; 37 | @import "mixins/center-block.less"; 38 | @import "mixins/nav-vertical-align.less"; 39 | @import "mixins/grid-framework.less"; 40 | @import "mixins/grid.less"; 41 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/mixins/alerts.less: -------------------------------------------------------------------------------- 1 | // Alerts 2 | 3 | .alert-variant(@background; @border; @text-color) { 4 | background-color: @background; 5 | border-color: @border; 6 | color: @text-color; 7 | 8 | hr { 9 | border-top-color: darken(@border, 5%); 10 | } 11 | .alert-link { 12 | color: darken(@text-color, 10%); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/mixins/background-variant.less: -------------------------------------------------------------------------------- 1 | // Contextual backgrounds 2 | 3 | .bg-variant(@color) { 4 | background-color: @color; 5 | a&:hover, 6 | a&:focus { 7 | background-color: darken(@color, 10%); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/mixins/border-radius.less: -------------------------------------------------------------------------------- 1 | // Single side border-radius 2 | 3 | .border-top-radius(@radius) { 4 | border-top-right-radius: @radius; 5 | border-top-left-radius: @radius; 6 | } 7 | .border-right-radius(@radius) { 8 | border-bottom-right-radius: @radius; 9 | border-top-right-radius: @radius; 10 | } 11 | .border-bottom-radius(@radius) { 12 | border-bottom-right-radius: @radius; 13 | border-bottom-left-radius: @radius; 14 | } 15 | .border-left-radius(@radius) { 16 | border-bottom-left-radius: @radius; 17 | border-top-left-radius: @radius; 18 | } 19 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/mixins/buttons.less: -------------------------------------------------------------------------------- 1 | // Button variants 2 | // 3 | // Easily pump out default styles, as well as :hover, :focus, :active, 4 | // and disabled options for all buttons 5 | 6 | .button-variant(@color; @background; @border) { 7 | color: @color; 8 | background-color: @background; 9 | border-color: @border; 10 | 11 | &:focus, 12 | &.focus { 13 | color: @color; 14 | background-color: darken(@background, 10%); 15 | border-color: darken(@border, 25%); 16 | } 17 | &:hover { 18 | color: @color; 19 | background-color: darken(@background, 10%); 20 | border-color: darken(@border, 12%); 21 | } 22 | &:active, 23 | &.active, 24 | .open > .dropdown-toggle& { 25 | color: @color; 26 | background-color: darken(@background, 10%); 27 | border-color: darken(@border, 12%); 28 | 29 | &:hover, 30 | &:focus, 31 | &.focus { 32 | color: @color; 33 | background-color: darken(@background, 17%); 34 | border-color: darken(@border, 25%); 35 | } 36 | } 37 | &:active, 38 | &.active, 39 | .open > .dropdown-toggle& { 40 | background-image: none; 41 | } 42 | &.disabled, 43 | &[disabled], 44 | fieldset[disabled] & { 45 | &, 46 | &:hover, 47 | &:focus, 48 | &.focus, 49 | &:active, 50 | &.active { 51 | background-color: @background; 52 | border-color: @border; 53 | } 54 | } 55 | 56 | .badge { 57 | color: @background; 58 | background-color: @color; 59 | } 60 | } 61 | 62 | // Button sizes 63 | .button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) { 64 | padding: @padding-vertical @padding-horizontal; 65 | font-size: @font-size; 66 | line-height: @line-height; 67 | border-radius: @border-radius; 68 | } 69 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/mixins/center-block.less: -------------------------------------------------------------------------------- 1 | // Center-align a block level element 2 | 3 | .center-block() { 4 | display: block; 5 | margin-left: auto; 6 | margin-right: auto; 7 | } 8 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/mixins/clearfix.less: -------------------------------------------------------------------------------- 1 | // Clearfix 2 | // 3 | // For modern browsers 4 | // 1. The space content is one way to avoid an Opera bug when the 5 | // contenteditable attribute is included anywhere else in the document. 6 | // Otherwise it causes space to appear at the top and bottom of elements 7 | // that are clearfixed. 8 | // 2. The use of `table` rather than `block` is only necessary if using 9 | // `:before` to contain the top-margins of child elements. 10 | // 11 | // Source: http://nicolasgallagher.com/micro-clearfix-hack/ 12 | 13 | .clearfix() { 14 | &:before, 15 | &:after { 16 | content: " "; // 1 17 | display: table; // 2 18 | } 19 | &:after { 20 | clear: both; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/mixins/hide-text.less: -------------------------------------------------------------------------------- 1 | // CSS image replacement 2 | // 3 | // Heads up! v3 launched with only `.hide-text()`, but per our pattern for 4 | // mixins being reused as classes with the same name, this doesn't hold up. As 5 | // of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`. 6 | // 7 | // Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757 8 | 9 | // Deprecated as of v3.0.1 (will be removed in v4) 10 | .hide-text() { 11 | font: ~"0/0" a; 12 | color: transparent; 13 | text-shadow: none; 14 | background-color: transparent; 15 | border: 0; 16 | } 17 | 18 | // New mixin to use as of v3.0.1 19 | .text-hide() { 20 | .hide-text(); 21 | } 22 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/mixins/image.less: -------------------------------------------------------------------------------- 1 | // Image Mixins 2 | // - Responsive image 3 | // - Retina image 4 | 5 | 6 | // Responsive image 7 | // 8 | // Keep images from scaling beyond the width of their parents. 9 | .img-responsive(@display: block) { 10 | display: @display; 11 | max-width: 100%; // Part 1: Set a maximum relative to the parent 12 | height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching 13 | } 14 | 15 | 16 | // Retina image 17 | // 18 | // Short retina mixin for setting background-image and -size. Note that the 19 | // spelling of `min--moz-device-pixel-ratio` is intentional. 20 | .img-retina(@file-1x; @file-2x; @width-1x; @height-1x) { 21 | background-image: url("@{file-1x}"); 22 | 23 | @media 24 | only screen and (-webkit-min-device-pixel-ratio: 2), 25 | only screen and ( min--moz-device-pixel-ratio: 2), 26 | only screen and ( -o-min-device-pixel-ratio: 2/1), 27 | only screen and ( min-device-pixel-ratio: 2), 28 | only screen and ( min-resolution: 192dpi), 29 | only screen and ( min-resolution: 2dppx) { 30 | background-image: url("@{file-2x}"); 31 | background-size: @width-1x @height-1x; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/mixins/labels.less: -------------------------------------------------------------------------------- 1 | // Labels 2 | 3 | .label-variant(@color) { 4 | background-color: @color; 5 | 6 | &[href] { 7 | &:hover, 8 | &:focus { 9 | background-color: darken(@color, 10%); 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/mixins/list-group.less: -------------------------------------------------------------------------------- 1 | // List Groups 2 | 3 | .list-group-item-variant(@state; @background; @color) { 4 | .list-group-item-@{state} { 5 | color: @color; 6 | background-color: @background; 7 | 8 | a&, 9 | button& { 10 | color: @color; 11 | 12 | .list-group-item-heading { 13 | color: inherit; 14 | } 15 | 16 | &:hover, 17 | &:focus { 18 | color: @color; 19 | background-color: darken(@background, 5%); 20 | } 21 | &.active, 22 | &.active:hover, 23 | &.active:focus { 24 | color: #fff; 25 | background-color: @color; 26 | border-color: @color; 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/mixins/nav-divider.less: -------------------------------------------------------------------------------- 1 | // Horizontal dividers 2 | // 3 | // Dividers (basically an hr) within dropdowns and nav lists 4 | 5 | .nav-divider(@color: #e5e5e5) { 6 | height: 1px; 7 | margin: ((@line-height-computed / 2) - 1) 0; 8 | overflow: hidden; 9 | background-color: @color; 10 | } 11 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/mixins/nav-vertical-align.less: -------------------------------------------------------------------------------- 1 | // Navbar vertical align 2 | // 3 | // Vertically center elements in the navbar. 4 | // Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin. 5 | 6 | .navbar-vertical-align(@element-height) { 7 | margin-top: ((@navbar-height - @element-height) / 2); 8 | margin-bottom: ((@navbar-height - @element-height) / 2); 9 | } 10 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/mixins/opacity.less: -------------------------------------------------------------------------------- 1 | // Opacity 2 | 3 | .opacity(@opacity) { 4 | opacity: @opacity; 5 | // IE8 filter 6 | @opacity-ie: (@opacity * 100); 7 | filter: ~"alpha(opacity=@{opacity-ie})"; 8 | } 9 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/mixins/pagination.less: -------------------------------------------------------------------------------- 1 | // Pagination 2 | 3 | .pagination-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) { 4 | > li { 5 | > a, 6 | > span { 7 | padding: @padding-vertical @padding-horizontal; 8 | font-size: @font-size; 9 | line-height: @line-height; 10 | } 11 | &:first-child { 12 | > a, 13 | > span { 14 | .border-left-radius(@border-radius); 15 | } 16 | } 17 | &:last-child { 18 | > a, 19 | > span { 20 | .border-right-radius(@border-radius); 21 | } 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/mixins/panels.less: -------------------------------------------------------------------------------- 1 | // Panels 2 | 3 | .panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) { 4 | border-color: @border; 5 | 6 | & > .panel-heading { 7 | color: @heading-text-color; 8 | background-color: @heading-bg-color; 9 | border-color: @heading-border; 10 | 11 | + .panel-collapse > .panel-body { 12 | border-top-color: @border; 13 | } 14 | .badge { 15 | color: @heading-bg-color; 16 | background-color: @heading-text-color; 17 | } 18 | } 19 | & > .panel-footer { 20 | + .panel-collapse > .panel-body { 21 | border-bottom-color: @border; 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/mixins/progress-bar.less: -------------------------------------------------------------------------------- 1 | // Progress bars 2 | 3 | .progress-bar-variant(@color) { 4 | background-color: @color; 5 | 6 | // Deprecated parent class requirement as of v3.2.0 7 | .progress-striped & { 8 | #gradient > .striped(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/mixins/reset-filter.less: -------------------------------------------------------------------------------- 1 | // Reset filters for IE 2 | // 3 | // When you need to remove a gradient background, do not forget to use this to reset 4 | // the IE filter for IE9 and below. 5 | 6 | .reset-filter() { 7 | filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)")); 8 | } 9 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/mixins/reset-text.less: -------------------------------------------------------------------------------- 1 | .reset-text() { 2 | font-family: @font-family-base; 3 | // We deliberately do NOT reset font-size. 4 | font-style: normal; 5 | font-weight: normal; 6 | letter-spacing: normal; 7 | line-break: auto; 8 | line-height: @line-height-base; 9 | text-align: left; // Fallback for where `start` is not supported 10 | text-align: start; 11 | text-decoration: none; 12 | text-shadow: none; 13 | text-transform: none; 14 | white-space: normal; 15 | word-break: normal; 16 | word-spacing: normal; 17 | word-wrap: normal; 18 | } 19 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/mixins/resize.less: -------------------------------------------------------------------------------- 1 | // Resize anything 2 | 3 | .resizable(@direction) { 4 | resize: @direction; // Options: horizontal, vertical, both 5 | overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible` 6 | } 7 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/mixins/responsive-visibility.less: -------------------------------------------------------------------------------- 1 | // Responsive utilities 2 | 3 | // 4 | // More easily include all the states for responsive-utilities.less. 5 | .responsive-visibility() { 6 | display: block !important; 7 | table& { display: table !important; } 8 | tr& { display: table-row !important; } 9 | th&, 10 | td& { display: table-cell !important; } 11 | } 12 | 13 | .responsive-invisibility() { 14 | display: none !important; 15 | } 16 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/mixins/size.less: -------------------------------------------------------------------------------- 1 | // Sizing shortcuts 2 | 3 | .size(@width; @height) { 4 | width: @width; 5 | height: @height; 6 | } 7 | 8 | .square(@size) { 9 | .size(@size; @size); 10 | } 11 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/mixins/tab-focus.less: -------------------------------------------------------------------------------- 1 | // WebKit-style focus 2 | 3 | .tab-focus() { 4 | // Default 5 | outline: thin dotted; 6 | // WebKit 7 | outline: 5px auto -webkit-focus-ring-color; 8 | outline-offset: -2px; 9 | } 10 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/mixins/table-row.less: -------------------------------------------------------------------------------- 1 | // Tables 2 | 3 | .table-row-variant(@state; @background) { 4 | // Exact selectors below required to override `.table-striped` and prevent 5 | // inheritance to nested tables. 6 | .table > thead > tr, 7 | .table > tbody > tr, 8 | .table > tfoot > tr { 9 | > td.@{state}, 10 | > th.@{state}, 11 | &.@{state} > td, 12 | &.@{state} > th { 13 | background-color: @background; 14 | } 15 | } 16 | 17 | // Hover states for `.table-hover` 18 | // Note: this is not available for cells or rows within `thead` or `tfoot`. 19 | .table-hover > tbody > tr { 20 | > td.@{state}:hover, 21 | > th.@{state}:hover, 22 | &.@{state}:hover > td, 23 | &:hover > .@{state}, 24 | &.@{state}:hover > th { 25 | background-color: darken(@background, 5%); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/mixins/text-emphasis.less: -------------------------------------------------------------------------------- 1 | // Typography 2 | 3 | .text-emphasis-variant(@color) { 4 | color: @color; 5 | a&:hover, 6 | a&:focus { 7 | color: darken(@color, 10%); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/mixins/text-overflow.less: -------------------------------------------------------------------------------- 1 | // Text overflow 2 | // Requires inline-block or block for proper styling 3 | 4 | .text-overflow() { 5 | overflow: hidden; 6 | text-overflow: ellipsis; 7 | white-space: nowrap; 8 | } 9 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/pager.less: -------------------------------------------------------------------------------- 1 | // 2 | // Pager pagination 3 | // -------------------------------------------------- 4 | 5 | 6 | .pager { 7 | padding-left: 0; 8 | margin: @line-height-computed 0; 9 | list-style: none; 10 | text-align: center; 11 | &:extend(.clearfix all); 12 | li { 13 | display: inline; 14 | > a, 15 | > span { 16 | display: inline-block; 17 | padding: 5px 14px; 18 | background-color: @pager-bg; 19 | border: 1px solid @pager-border; 20 | border-radius: @pager-border-radius; 21 | } 22 | 23 | > a:hover, 24 | > a:focus { 25 | text-decoration: none; 26 | background-color: @pager-hover-bg; 27 | } 28 | } 29 | 30 | .next { 31 | > a, 32 | > span { 33 | float: right; 34 | } 35 | } 36 | 37 | .previous { 38 | > a, 39 | > span { 40 | float: left; 41 | } 42 | } 43 | 44 | .disabled { 45 | > a, 46 | > a:hover, 47 | > a:focus, 48 | > span { 49 | color: @pager-disabled-color; 50 | background-color: @pager-bg; 51 | cursor: @cursor-disabled; 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/pagination.less: -------------------------------------------------------------------------------- 1 | // 2 | // Pagination (multiple pages) 3 | // -------------------------------------------------- 4 | .pagination { 5 | display: inline-block; 6 | padding-left: 0; 7 | margin: @line-height-computed 0; 8 | border-radius: @border-radius-base; 9 | 10 | > li { 11 | display: inline; // Remove list-style and block-level defaults 12 | > a, 13 | > span { 14 | position: relative; 15 | float: left; // Collapse white-space 16 | padding: @padding-base-vertical @padding-base-horizontal; 17 | line-height: @line-height-base; 18 | text-decoration: none; 19 | color: @pagination-color; 20 | background-color: @pagination-bg; 21 | border: 1px solid @pagination-border; 22 | margin-left: -1px; 23 | } 24 | &:first-child { 25 | > a, 26 | > span { 27 | margin-left: 0; 28 | .border-left-radius(@border-radius-base); 29 | } 30 | } 31 | &:last-child { 32 | > a, 33 | > span { 34 | .border-right-radius(@border-radius-base); 35 | } 36 | } 37 | } 38 | 39 | > li > a, 40 | > li > span { 41 | &:hover, 42 | &:focus { 43 | z-index: 3; 44 | color: @pagination-hover-color; 45 | background-color: @pagination-hover-bg; 46 | border-color: @pagination-hover-border; 47 | } 48 | } 49 | 50 | > .active > a, 51 | > .active > span { 52 | &, 53 | &:hover, 54 | &:focus { 55 | z-index: 2; 56 | color: @pagination-active-color; 57 | background-color: @pagination-active-bg; 58 | border-color: @pagination-active-border; 59 | cursor: default; 60 | } 61 | } 62 | 63 | > .disabled { 64 | > span, 65 | > span:hover, 66 | > span:focus, 67 | > a, 68 | > a:hover, 69 | > a:focus { 70 | color: @pagination-disabled-color; 71 | background-color: @pagination-disabled-bg; 72 | border-color: @pagination-disabled-border; 73 | cursor: @cursor-disabled; 74 | } 75 | } 76 | } 77 | 78 | // Sizing 79 | // -------------------------------------------------- 80 | 81 | // Large 82 | .pagination-lg { 83 | .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large); 84 | } 85 | 86 | // Small 87 | .pagination-sm { 88 | .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small); 89 | } 90 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/print.less: -------------------------------------------------------------------------------- 1 | /*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ 2 | 3 | // ========================================================================== 4 | // Print styles. 5 | // Inlined to avoid the additional HTTP request: h5bp.com/r 6 | // ========================================================================== 7 | 8 | @media print { 9 | *, 10 | *:before, 11 | *:after { 12 | background: transparent !important; 13 | color: #000 !important; // Black prints faster: h5bp.com/s 14 | box-shadow: none !important; 15 | text-shadow: none !important; 16 | } 17 | 18 | a, 19 | a:visited { 20 | text-decoration: underline; 21 | } 22 | 23 | a[href]:after { 24 | content: " (" attr(href) ")"; 25 | } 26 | 27 | abbr[title]:after { 28 | content: " (" attr(title) ")"; 29 | } 30 | 31 | // Don't show links that are fragment identifiers, 32 | // or use the `javascript:` pseudo protocol 33 | a[href^="#"]:after, 34 | a[href^="javascript:"]:after { 35 | content: ""; 36 | } 37 | 38 | pre, 39 | blockquote { 40 | border: 1px solid #999; 41 | page-break-inside: avoid; 42 | } 43 | 44 | thead { 45 | display: table-header-group; // h5bp.com/t 46 | } 47 | 48 | tr, 49 | img { 50 | page-break-inside: avoid; 51 | } 52 | 53 | img { 54 | max-width: 100% !important; 55 | } 56 | 57 | p, 58 | h2, 59 | h3 { 60 | orphans: 3; 61 | widows: 3; 62 | } 63 | 64 | h2, 65 | h3 { 66 | page-break-after: avoid; 67 | } 68 | 69 | // Bootstrap specific changes start 70 | 71 | // Bootstrap components 72 | .navbar { 73 | display: none; 74 | } 75 | .btn, 76 | .dropup > .btn { 77 | > .caret { 78 | border-top-color: #000 !important; 79 | } 80 | } 81 | .label { 82 | border: 1px solid #000; 83 | } 84 | 85 | .table { 86 | border-collapse: collapse !important; 87 | 88 | td, 89 | th { 90 | background-color: #fff !important; 91 | } 92 | } 93 | .table-bordered { 94 | th, 95 | td { 96 | border: 1px solid #ddd !important; 97 | } 98 | } 99 | 100 | // Bootstrap specific changes end 101 | } 102 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/progress-bars.less: -------------------------------------------------------------------------------- 1 | // 2 | // Progress bars 3 | // -------------------------------------------------- 4 | 5 | 6 | // Bar animations 7 | // ------------------------- 8 | 9 | // WebKit 10 | @-webkit-keyframes progress-bar-stripes { 11 | from { background-position: 40px 0; } 12 | to { background-position: 0 0; } 13 | } 14 | 15 | // Spec and IE10+ 16 | @keyframes progress-bar-stripes { 17 | from { background-position: 40px 0; } 18 | to { background-position: 0 0; } 19 | } 20 | 21 | 22 | // Bar itself 23 | // ------------------------- 24 | 25 | // Outer container 26 | .progress { 27 | overflow: hidden; 28 | height: @line-height-computed; 29 | margin-bottom: @line-height-computed; 30 | background-color: @progress-bg; 31 | border-radius: @progress-border-radius; 32 | .box-shadow(inset 0 1px 2px rgba(0,0,0,.1)); 33 | } 34 | 35 | // Bar of progress 36 | .progress-bar { 37 | float: left; 38 | width: 0%; 39 | height: 100%; 40 | font-size: @font-size-small; 41 | line-height: @line-height-computed; 42 | color: @progress-bar-color; 43 | text-align: center; 44 | background-color: @progress-bar-bg; 45 | .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15)); 46 | .transition(width .6s ease); 47 | } 48 | 49 | // Striped bars 50 | // 51 | // `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the 52 | // `.progress-bar-striped` class, which you just add to an existing 53 | // `.progress-bar`. 54 | .progress-striped .progress-bar, 55 | .progress-bar-striped { 56 | #gradient > .striped(); 57 | background-size: 40px 40px; 58 | } 59 | 60 | // Call animation for the active one 61 | // 62 | // `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the 63 | // `.progress-bar.active` approach. 64 | .progress.active .progress-bar, 65 | .progress-bar.active { 66 | .animation(progress-bar-stripes 2s linear infinite); 67 | } 68 | 69 | 70 | // Variations 71 | // ------------------------- 72 | 73 | .progress-bar-success { 74 | .progress-bar-variant(@progress-bar-success-bg); 75 | } 76 | 77 | .progress-bar-info { 78 | .progress-bar-variant(@progress-bar-info-bg); 79 | } 80 | 81 | .progress-bar-warning { 82 | .progress-bar-variant(@progress-bar-warning-bg); 83 | } 84 | 85 | .progress-bar-danger { 86 | .progress-bar-variant(@progress-bar-danger-bg); 87 | } 88 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/responsive-embed.less: -------------------------------------------------------------------------------- 1 | // Embeds responsive 2 | // 3 | // Credit: Nicolas Gallagher and SUIT CSS. 4 | 5 | .embed-responsive { 6 | position: relative; 7 | display: block; 8 | height: 0; 9 | padding: 0; 10 | overflow: hidden; 11 | 12 | .embed-responsive-item, 13 | iframe, 14 | embed, 15 | object, 16 | video { 17 | position: absolute; 18 | top: 0; 19 | left: 0; 20 | bottom: 0; 21 | height: 100%; 22 | width: 100%; 23 | border: 0; 24 | } 25 | } 26 | 27 | // Modifier class for 16:9 aspect ratio 28 | .embed-responsive-16by9 { 29 | padding-bottom: 56.25%; 30 | } 31 | 32 | // Modifier class for 4:3 aspect ratio 33 | .embed-responsive-4by3 { 34 | padding-bottom: 75%; 35 | } 36 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/thumbnails.less: -------------------------------------------------------------------------------- 1 | // 2 | // Thumbnails 3 | // -------------------------------------------------- 4 | 5 | 6 | // Mixin and adjust the regular image class 7 | .thumbnail { 8 | display: block; 9 | padding: @thumbnail-padding; 10 | margin-bottom: @line-height-computed; 11 | line-height: @line-height-base; 12 | background-color: @thumbnail-bg; 13 | border: 1px solid @thumbnail-border; 14 | border-radius: @thumbnail-border-radius; 15 | .transition(border .2s ease-in-out); 16 | 17 | > img, 18 | a > img { 19 | &:extend(.img-responsive); 20 | margin-left: auto; 21 | margin-right: auto; 22 | } 23 | 24 | // Add a hover state for linked versions only 25 | a&:hover, 26 | a&:focus, 27 | a&.active { 28 | border-color: @link-color; 29 | } 30 | 31 | // Image captions 32 | .caption { 33 | padding: @thumbnail-caption-padding; 34 | color: @thumbnail-caption-color; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/utilities.less: -------------------------------------------------------------------------------- 1 | // 2 | // Utility classes 3 | // -------------------------------------------------- 4 | 5 | 6 | // Floats 7 | // ------------------------- 8 | 9 | .clearfix { 10 | .clearfix(); 11 | } 12 | .center-block { 13 | .center-block(); 14 | } 15 | .pull-right { 16 | float: right !important; 17 | } 18 | .pull-left { 19 | float: left !important; 20 | } 21 | 22 | 23 | // Toggling content 24 | // ------------------------- 25 | 26 | // Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1 27 | .hide { 28 | display: none !important; 29 | } 30 | .show { 31 | display: block !important; 32 | } 33 | .invisible { 34 | visibility: hidden; 35 | } 36 | .text-hide { 37 | .text-hide(); 38 | } 39 | 40 | 41 | // Hide from screenreaders and browsers 42 | // 43 | // Credit: HTML5 Boilerplate 44 | 45 | .hidden { 46 | display: none !important; 47 | } 48 | 49 | 50 | // For Affix plugin 51 | // ------------------------- 52 | 53 | .affix { 54 | position: fixed; 55 | } 56 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/bootstrap/wells.less: -------------------------------------------------------------------------------- 1 | // 2 | // Wells 3 | // -------------------------------------------------- 4 | 5 | 6 | // Base class 7 | .well { 8 | min-height: 20px; 9 | padding: 19px; 10 | margin-bottom: 20px; 11 | background-color: @well-bg; 12 | border: 1px solid @well-border; 13 | border-radius: @border-radius-base; 14 | .box-shadow(inset 0 1px 1px rgba(0,0,0,.05)); 15 | blockquote { 16 | border-color: #ddd; 17 | border-color: rgba(0,0,0,.15); 18 | } 19 | } 20 | 21 | // Sizes 22 | .well-lg { 23 | padding: 24px; 24 | border-radius: @border-radius-large; 25 | } 26 | .well-sm { 27 | padding: 9px; 28 | border-radius: @border-radius-small; 29 | } 30 | -------------------------------------------------------------------------------- /themes/daux/less/vendor/highlight.less: -------------------------------------------------------------------------------- 1 | /* =========================================================================================== 2 | Code Highlighting 3 | ============================================================================================== */ 4 | 5 | /* 6 | codepen.io Embed Theme 7 | Author: Justin Perry 8 | Original theme - https://github.com/chriskempson/tomorrow-theme 9 | */ 10 | 11 | .hljs { 12 | display: block; 13 | overflow-x: auto; 14 | padding: 0.5em; 15 | background: #222; 16 | color: #fff; 17 | } 18 | 19 | .hljs-comment, 20 | .hljs-quote { 21 | color: #777; 22 | } 23 | 24 | .hljs-variable, 25 | .hljs-template-variable, 26 | .hljs-tag, 27 | .hljs-regexp, 28 | .hljs-meta, 29 | .hljs-number, 30 | .hljs-built_in, 31 | .hljs-builtin-name, 32 | .hljs-literal, 33 | .hljs-params, 34 | .hljs-symbol, 35 | .hljs-bullet, 36 | .hljs-link, 37 | .hljs-deletion { 38 | color: #ab875d; 39 | } 40 | 41 | .hljs-section, 42 | .hljs-title, 43 | .hljs-name, 44 | .hljs-selector-id, 45 | .hljs-selector-class, 46 | .hljs-type, 47 | .hljs-attribute { 48 | color: #9b869b; 49 | } 50 | 51 | .hljs-string, 52 | .hljs-keyword, 53 | .hljs-selector-tag, 54 | .hljs-addition { 55 | color: #8f9c6c; 56 | } 57 | 58 | .hljs-emphasis { 59 | font-style: italic; 60 | } 61 | 62 | .hljs-strong { 63 | font-weight: bold; 64 | } 65 | -------------------------------------------------------------------------------- /themes/daux_singlepage/less/main.less: -------------------------------------------------------------------------------- 1 | // Core variables and mixins 2 | @import "vendor/bootstrap/variables.less"; 3 | @import "vendor/bootstrap/normalize.less"; 4 | @import "vendor/bootstrap/scaffolding.less"; 5 | @import "vendor/bootstrap/type.less"; 6 | @import "variables.less"; 7 | @import "fonts.less"; 8 | @import "vendor/highlight.less"; 9 | @import "typography.less"; 10 | 11 | * { 12 | -webkit-overflow-scrolling: touch; 13 | -webkit-tap-highlight-color: transparent; 14 | -webkit-touch-callout: none; 15 | -webkit-font-smoothing: antialiased; 16 | } 17 | 18 | html, body { 19 | height: 100%; 20 | } 21 | 22 | body { 23 | text-rendering: optimizeLegibility; 24 | font-smoothing: antialiased; 25 | font-family: @font-family-base; 26 | } 27 | 28 | img { 29 | max-width: 100% !important; 30 | } 31 | 32 | .page-break { display: none; } 33 | 34 | @media screen { 35 | body { 36 | margin: 1em; 37 | } 38 | } 39 | 40 | @media print { 41 | @import "print.less"; 42 | } 43 | -------------------------------------------------------------------------------- /themes/daux_singlepage/less/print.less: -------------------------------------------------------------------------------- 1 | 2 | * { 3 | text-shadow: none !important; 4 | color: #000 !important; // Black prints faster: h5bp.com/s 5 | background: transparent !important; 6 | box-shadow: none !important; 7 | } 8 | 9 | .page-break { 10 | display: block; 11 | page-break-before: always; 12 | } 13 | 14 | h1, h2 { 15 | page-break-after: avoid; 16 | page-break-before: auto; 17 | } 18 | 19 | pre, blockquote { 20 | border: 1px solid #999; 21 | page-break-inside: avoid; 22 | } 23 | 24 | img { 25 | page-break-inside: avoid; 26 | } 27 | 28 | a, 29 | a:visited { 30 | text-decoration: underline; 31 | } 32 | 33 | a[href]::after { 34 | content: " (" attr(href) ")"; 35 | } 36 | 37 | abbr[title]::after { 38 | content: " (" attr(title) ")"; 39 | } 40 | -------------------------------------------------------------------------------- /themes/daux_singlepage/less/typography.less: -------------------------------------------------------------------------------- 1 | section.content { 2 | padding: 15px 25px 25px; 3 | background-color: white; 4 | 5 | @import "../../common/less/_typography.less"; 6 | } 7 | -------------------------------------------------------------------------------- /themes/daux_singlepage/less/vendor/bootstrap/scaffolding.less: -------------------------------------------------------------------------------- 1 | // 2 | // Scaffolding 3 | // -------------------------------------------------- 4 | 5 | 6 | // Reset the box-sizing 7 | 8 | *, 9 | *:before, 10 | *:after { 11 | -webkit-box-sizing: border-box; 12 | -moz-box-sizing: border-box; 13 | box-sizing: border-box; 14 | } 15 | 16 | 17 | // Body reset 18 | 19 | html { 20 | font-size: 62.5%; 21 | -webkit-tap-highlight-color: rgba(0,0,0,0); 22 | } 23 | 24 | body { 25 | font-family: @font-family-base; 26 | font-size: @font-size-base; 27 | line-height: @line-height-base; 28 | color: @text-color; 29 | background-color: @body-bg; 30 | } 31 | 32 | // Reset fonts for relevant elements 33 | input, 34 | button, 35 | select, 36 | textarea { 37 | font-family: inherit; 38 | font-size: inherit; 39 | line-height: inherit; 40 | } 41 | 42 | // Reset unusual Firefox-on-Android default style. 43 | // 44 | // See https://github.com/necolas/normalize.css/issues/214 45 | 46 | button, 47 | input, 48 | select[multiple], 49 | textarea { 50 | background-image: none; 51 | } 52 | 53 | 54 | // Links 55 | 56 | a { 57 | color: @link-color; 58 | text-decoration: none; 59 | 60 | &:hover, 61 | &:focus { 62 | color: @link-hover-color; 63 | text-decoration: underline; 64 | } 65 | 66 | &:focus { 67 | // Default 68 | outline: thin dotted #333; 69 | // Webkit 70 | outline: 5px auto -webkit-focus-ring-color; 71 | outline-offset: -2px; 72 | } 73 | } 74 | 75 | 76 | // Images 77 | 78 | img { 79 | vertical-align: middle; 80 | } 81 | 82 | // Horizontal rules 83 | 84 | hr { 85 | margin-top: @line-height-computed; 86 | margin-bottom: @line-height-computed; 87 | border: 0; 88 | border-top: 1px solid @hr-border; 89 | } 90 | 91 | 92 | // Only display content to screen readers 93 | // 94 | // See: http://a11yproject.com/posts/how-to-hide-content/ 95 | 96 | .sr-only { 97 | position: absolute; 98 | width: 1px; 99 | height: 1px; 100 | margin: -1px; 101 | padding: 0; 102 | overflow: hidden; 103 | clip: rect(0 0 0 0); 104 | border: 0; 105 | } 106 | -------------------------------------------------------------------------------- /themes/daux_singlepage/less/vendor/highlight.less: -------------------------------------------------------------------------------- 1 | /* http://jmblog.github.com/color-themes-for-google-code-highlightjs */ 2 | 3 | /* Tomorrow Comment */ 4 | .hljs-comment { 5 | color: hsl(207, 35%, 35%); 6 | } 7 | 8 | /* Tomorrow Red */ 9 | .hljs-variable, 10 | .hljs-attribute, 11 | .hljs-tag, 12 | .hljs-regexp, 13 | .ruby .hljs-constant, 14 | .xml .hljs-tag .hljs-title, 15 | .xml .hljs-pi, 16 | .xml .hljs-doctype, 17 | .html .hljs-doctype, 18 | .css .hljs-id, 19 | .css .hljs-class, 20 | .css .hljs-pseudo { 21 | color: #c82829; 22 | } 23 | 24 | /* Tomorrow Orange */ 25 | .hljs-number, 26 | .hljs-preprocessor, 27 | .hljs-pragma, 28 | .hljs-built_in, 29 | .hljs-literal, 30 | .hljs-constant, 31 | .hljs-function .hljs-title { 32 | color: hsl(50, 100%, 60%); 33 | } 34 | 35 | /* Tomorrow Yellow */ 36 | .ruby .hljs-class .hljs-title, 37 | .css .hljs-rules .hljs-attribute { 38 | color: #eab700; 39 | } 40 | 41 | /* Tomorrow Green */ 42 | .hljs-string, 43 | .hljs-value, 44 | .hljs-inheritance, 45 | .hljs-header, 46 | .ruby .hljs-symbol, 47 | .xml .hljs-cdata { 48 | color: hsl(0, 100%, 70%); 49 | } 50 | 51 | /* Tomorrow Aqua */ 52 | .css .hljs-hexcolor { 53 | color: #3e999f; 54 | } 55 | 56 | /* Tomorrow Blue */ 57 | .hljs-function .keyword, 58 | .python .hljs-decorator, 59 | .python .hljs-title, 60 | .ruby .hljs-function .hljs-title, 61 | .ruby .hljs-title .hljs-keyword, 62 | .perl .hljs-sub, 63 | .javascript .hljs-title, 64 | .coffeescript .hljs-title { 65 | color: hsl(207, 70%, 60%); 66 | } 67 | 68 | /* Tomorrow Purple */ 69 | .hljs-keyword, 70 | .javascript .hljs-function { 71 | color: hsl(207, 95%, 70%); 72 | } 73 | 74 | .hljs { 75 | display: block; 76 | background: white; 77 | color: #4d4d4c; 78 | padding: 0.5em; 79 | font-family: "Anonymous Pro", "Inconsolata", "Monaco", monospace; 80 | } 81 | 82 | .coffeescript .javascript, 83 | .javascript .xml, 84 | .tex .hljs-formula, 85 | .xml .javascript, 86 | .xml .vbscript, 87 | .xml .css, 88 | .xml .hljs-cdata { 89 | opacity: 0.5; 90 | } -------------------------------------------------------------------------------- /tipuesearch/tipuesearch_set.js: -------------------------------------------------------------------------------- 1 | /* 2 | Tipue Search 5.0 3 | Copyright (c) 2015 Tipue 4 | Tipue Search is released under the MIT License 5 | http://www.tipue.com/search 6 | */ 7 | 8 | 9 | // Stop words (list from http://www.ranks.nl/stopwords) 10 | var tipuesearch_stop_words = ["a", "about", "above", "after", "again", "against", "all", "am", "an", "and", "any", "are", "aren't", "as", "at", "be", "because", "been", "before", "being", "below", "between", "both", "but", "by", "can't", "cannot", "could", "couldn't", "did", "didn't", "do", "does", "doesn't", "doing", "don't", "down", "during", "each", "few", "for", "from", "further", "had", "hadn't", "has", "hasn't", "have", "haven't", "having", "he", "he'd", "he'll", "he's", "her", "here", "here's", "hers", "herself", "him", "himself", "his", "how", "how's", "i", "i'd", "i'll", "i'm", "i've", "if", "in", "into", "is", "isn't", "it", "it's", "its", "itself", "let's", "me", "more", "most", "mustn't", "my", "myself", "no", "nor", "not", "of", "off", "on", "once", "only", "or", "other", "ought", "our", "ours", "ourselves", "out", "over", "own", "same", "shan't", "she", "she'd", "she'll", "she's", "should", "shouldn't", "so", "some", "such", "than", "that", "that's", "the", "their", "theirs", "them", "themselves", "then", "there", "there's", "these", "they", "they'd", "they'll", "they're", "they've", "this", "those", "through", "to", "too", "under", "until", "up", "very", "was", "wasn't", "we", "we'd", "we'll", "we're", "we've", "were", "weren't", "what", "what's", "when", "when's", "where", "where's", "which", "while", "who", "who's", "whom", "why", "why's", "with", "won't", "would", "wouldn't", "you", "you'd", "you'll", "you're", "you've", "your", "yours", "yourself", "yourselves"]; 11 | 12 | // Word replace 13 | var tipuesearch_replace = {'words': []}; 14 | 15 | // Weighting 16 | var tipuesearch_weight = {'weight': []}; 17 | 18 | // Stemming 19 | var tipuesearch_stem = {'words': []}; 20 | 21 | // Internal strings 22 | var tipuesearch_string_1 = 'No title'; 23 | var tipuesearch_string_2 = 'Showing results for'; 24 | var tipuesearch_string_3 = 'Search instead for'; 25 | var tipuesearch_string_4 = '1 result'; 26 | var tipuesearch_string_5 = 'results'; 27 | var tipuesearch_string_6 = 'Prev'; 28 | var tipuesearch_string_7 = 'Next'; 29 | var tipuesearch_string_8 = 'Nothing found'; 30 | var tipuesearch_string_9 = 'Common words are largely ignored'; 31 | var tipuesearch_string_10 = 'Search too short'; 32 | var tipuesearch_string_11 = 'Should be one character or more'; 33 | var tipuesearch_string_12 = 'Should be'; 34 | var tipuesearch_string_13 = 'characters or more'; 35 | --------------------------------------------------------------------------------