1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/movim_ynh.git synced 2024-09-03 19:46:19 +02:00

Merge branch 'dev'

This commit is contained in:
src386 2015-08-23 01:15:20 +02:00
commit de34015100
50 changed files with 47338 additions and 44562 deletions

View file

@ -5,10 +5,21 @@ Movim is a decentralized social network, written in PHP and HTML5 and based on t
Warning: BETA.
Current Movim version : 20150820.
Current Movim version : 20150821.
**Changelog**
0.8b 2015-08-23
- Added language selection : ar, de, es, it, ja, nl, ru
- Fix URL in manifest.json (was https://https://...)
- Public/Private policy changed. The SSO portal is not used anymore
But when a pod is marked as "private", only accounts with @yourdomain.com are able to connect.
This change was necessary for public content (blog)
- Add dedicated php-fpm pool for Movim
- Protect /log and /config properly
- Update to upstream Movim 20150821
- Fix #6 and #7
0.7b 2015-08-20
- Update to upstream Movim 20150820 to fix #5

0
TODO
View file

View file

@ -10,7 +10,7 @@ location PATHTOCHANGE {
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_pass unix:/var/run/php5-fpm-movim.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param REMOTE_USER $remote_user;
@ -31,11 +31,12 @@ location ~ ^PATHTOCHANGE/ws/ {
proxy_send_timeout 86400s;
proxy_redirect off;
}
# Include SSOWAT user panel.
include conf.d/yunohost_panel.conf.inc;
}
location ~ ^PATHTOCHANGE/(log|\.ht) {
deny all;
}
location ~ /\.ht {
deny all;
}
location ~ /(config|log)$ {
return 403;
}

15
conf/php-fpm.conf Normal file
View file

@ -0,0 +1,15 @@
[movim]
listen = /var/run/php5-fpm-movim.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0600
user = movim
group = movim
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
chdir = /var/www/movim
php_admin_value[open_basedir] = none

View file

@ -8,7 +8,7 @@
"maintainer": {
"name": "src386",
"email": "soyouz@src386.org",
"url": "http://https://github.com/src386"
"url": "http://github.com/src386"
},
"multi_instance": "false",
"arguments": {
@ -56,7 +56,7 @@
"en": "Pod language",
"fr": "Langue du pod"
},
"choices" : ["en", "fr"],
"choices" : ["ar", "de", "en", "es", "fr", "it", "ja", "nl", "ru"],
"default" : "en"
},
{

View file

@ -12,13 +12,13 @@ port=$7
# Check domain/path availability
sudo yunohost app checkurl $domain$path -a movim
if [[ ! $? -eq 0 ]]; then
exit 1
exit 1
fi
# Check port availability
sudo yunohost app checkport $port
if [[ ! $? -eq 0 ]]; then
exit 1
exit 1
fi
# Check user availability
@ -30,15 +30,17 @@ fi
# Check password not empty
if [[ -z "$password" ]]; then
printf "Error empty admin password, aborting"
exit 1
exit 1
fi
# Save parameters
sudo yunohost app setting movim admin -v $admin
sudo yunohost app setting movim public_site -v $public_site
sudo yunohost app setting movim port -v $port
sudo yunohost app setting movim path -v $path
# Generate random password
db_pwd=$(dd if=/dev/urandom bs=1 count=200 2> /dev/null | tr -c -d '[A-Za-z0-9]' | sed -n 's/\(.\{24\}\).*/\1/p')
db_pwd=$(dd if=/dev/urandom bs=1 count=200 2> /dev/null | tr -c -d '[[:alnum:]]')
# Use 'movim' as database name and user
db_user=movim
@ -54,18 +56,18 @@ sudo apt-get install php5-gd php5-curl php5-imagick php5-cli -y
final_path=/var/www/movim
sudo mkdir -p $final_path
sudo cp -a ../sources/* $final_path
sudo cp $final_path/config/db.example.inc.php $final_path/config/db.inc.php
# Create movim system user and set permissions
sudo useradd -d /var/www/movim -s /bin/sh movim
sudo chown -R movim:www-data $final_path
sudo chmod -R 770 $final_path
sudo chmod -R 750 $final_path
# Install PHP dependencies
sudo su -c "curl -sS https://getcomposer.org/installer | php -- --install-dir=$final_path" movim
sudo su -c "cd $final_path && php composer.phar install" movim
# Movim configuration
sudo cp $final_path/config/db.example.inc.php $final_path/config/db.inc.php
sudo sed -i "s@'username' => 'username'@'username' => '$db_user'@g" $final_path/config/db.inc.php
sudo sed -i "s@'password' => 'password'@'password' => '$db_pwd'@g" $final_path/config/db.inc.php
sudo sed -i "s@/ws/@$path/ws/@g" $final_path/app/assets/js/movim_websocket.js
@ -76,6 +78,10 @@ sudo su -c "cd $final_path && php mud.php config environment:production" movim
sudo su -c "cd $final_path && php mud.php config timezone:`cat /etc/timezone`" movim
sudo su -c "cd $final_path && php mud.php config username:$admin" movim
sudo su -c "cd $final_path && php mud.php config password:`echo -n $password | sha1sum | awk '{print $1}'`" movim
if [ $public_site = "No" ];
then
sudo su -c "cd $final_path && php mud.php config xmppwhitelist:$domain" movim
fi
sudo yunohost app addaccess movim -u $admin
# Copy init script or systemd service
@ -95,22 +101,20 @@ else
sudo /etc/init.d/movim start
fi
# php-fpm configuration
sudo cp ../conf/php-fpm.conf /etc/php5/fpm/pool.d/movim.conf
# Nginx configuration
sed -i "s@PATHTOCHANGE@$path@g" ../conf/nginx.conf
sed -i "s@ALIASTOCHANGE@$final_path/@g" ../conf/nginx.conf
sed -i "s@YHPORT@$port@g" ../conf/nginx.conf
sed -i "s@//ws/@/ws/@g" ../conf/nginx.conf # Avoid duplicate /
sudo cp ../conf/nginx.conf /etc/nginx/conf.d/$domain.d/movim.conf
# SSOwat Configuration
sudo yunohost app setting movim skipped_uris -v "/"
if [ $public_site = "No" ];
then
sudo yunohost app setting movim protected_uris -v "/"
else
sudo yunohost app setting movim protected_uris -v "/?q=admin"
fi
sudo yunohost app ssowatconf
# Start Movim
sudo service nginx reload
sudo service php5-fpm restart
sudo service nginx reload

View file

@ -4,20 +4,20 @@
path=$(sudo yunohost app setting movim path)
domain=$(sudo yunohost app setting movim domain)
port=$(sudo yunohost app setting movim port)
public_site=$(sudo yunohost app setting movim public_site)
# Install Movim files
final_path=/var/www/movim
sudo cp -a ../sources/* $final_path
#sudo chown -R www-data: $final_path
# Create movim user if not exists and set permissions
if grep -q movim /etc/passwd; then
sudo chown -R movim:www-data $final_path
sudo chmod -R 770 $final_path
sudo chmod -R 750 $final_path
else
sudo useradd -s /bin/sh -d $final_path movim
sudo chown -R movim:www-data $final_path
sudo chmod -R 770 $final_path
sudo chmod -R 750 $final_path
fi
# Update PHP dependencies
@ -27,6 +27,15 @@ sudo su -c "cd $final_path && php composer.phar install" movim
# Movim configuration
sudo sed -i "s@/ws/@$path/ws/@g" $final_path/app/assets/js/movim_websocket.js
# Update xmppwhitelist if private
if [ $public_site = "No" ];
then
sudo su -c "cd $final_path && php mud.php config xmppwhitelist:$domain" movim
fi
# Delete obsolete SSO conf
sudo yunohost app setting movim protected_uris -d
# Update init scripts
sudo sed -i "s@YHURL@$domain$path@g" ../conf/movim.{service,init}
sudo sed -i "s@YHDIR@$final_path@g" ../conf/movim.{service,init}
@ -47,6 +56,18 @@ else
sudo /etc/init.d/movim start
fi
# Update php-fpm configuration
sudo cp ../conf/php-fpm.conf /etc/php5/fpm/pool.d/movim.conf
# Nginx configuration
sed -i "s@PATHTOCHANGE@$path@g" ../conf/nginx.conf
sed -i "s@ALIASTOCHANGE@$final_path/@g" ../conf/nginx.conf
sed -i "s@YHPORT@$port@g" ../conf/nginx.conf
sed -i "s@//ws/@/ws/@g" ../conf/nginx.conf # Avoid duplicate /
sudo cp ../conf/nginx.conf /etc/nginx/conf.d/$domain.d/movim.conf
# Reload
sudo yunohost app ssowatconf
sudo service movim restart
sudo service php5-fpm restart
sudo service nginx reload

View file

@ -224,7 +224,12 @@ function cleanJid($jid)
*/
function explodeJid($jid)
{
list($jid, $resource) = explode('/', $jid);
$arr = explode('/', $jid);
$jid = $arr[0];
if(isset($arr[1])) $resource = $arr[1];
else $resource = null;
list($username, $server) = explode('@', $jid);
return array(

View file

@ -261,7 +261,7 @@ class Contact extends Model {
public function setVcard4($vcard) {
if(isset($vcard->bday->date))
$this->date = (string)$vcard->bday->date;
if($empty($this->date))
if(empty($this->date))
$this->date = null;
$this->name = (string)$vcard->nickname->text;

View file

@ -1,7 +1,7 @@
#chat_header.encrypted:after{
content: "";
display: inline-block;
font-family: "Material Design Iconic Font";
font-family: "Material Design Iconic Font";
content: "\f041";
font-size: 2.5rem;
margin-left: 1rem;
@ -19,7 +19,7 @@
#chat_widget .chat_box ul {
margin: 0 auto;
max-width: 100rem;
margin-left: calc(50% - 51rem);
margin-left: calc(45% - 49rem);
}
#chat_widget .chat_box form {

View file

@ -121,6 +121,13 @@ var Chat = {
}
}
MovimWebsocket.attach(function() {
var jid = document.querySelector('#chat_widget').dataset.jid;
if(jid) {
Chat_ajaxGet(jid);
}
});
Upload.attach(function() {
var textarea = document.querySelector('#chat_textarea');
textarea.value = Upload.get + ' ' + textarea.value;

View file

@ -1,10 +1,3 @@
<div id="chat_widget">
<div id="chat_widget" {if="$jid"}data-jid="{$jid}"{/if}>
{$c->prepareEmpty()}
{if="$jid"}
<script type="text/javascript">
MovimWebsocket.attach(function() {
Chat_ajaxGet('{$jid}');
});
</script>
{/if}
</div>

View file

@ -15,6 +15,8 @@ class Chats extends WidgetBase
$this->registerEvent('carbons', 'onMessage');
$this->registerEvent('message', 'onMessage');
$this->registerEvent('presence', 'onPresence', 'chat');
$this->registerEvent('composing', 'onComposing');
$this->registerEvent('paused', 'onPaused');
}
function onMessage($packet)
@ -56,6 +58,29 @@ class Chats extends WidgetBase
}
}
function onComposing($array)
{
$this->setState($array, $this->__('chats.composing'));
}
function onPaused($array)
{
$this->setState($array, $this->__('chats.paused'));
}
private function setState($array, $message)
{
list($from, $to) = $array;
if($from == $this->user->getLogin()) {
$jid = $to;
} else {
$jid = $from;
}
RPC::call('movim_replace', $jid.'_chat_item', $this->prepareChat($jid, $message));
RPC::call('Chats.refresh');
}
/**
* @brief Get history
*/
@ -67,7 +92,7 @@ class Chats extends WidgetBase
$messages = $md->getContact(echapJid($jid), 0, 1);
$g = new \Moxl\Xec\Action\MAM\Get;
$g->setJid($jid);
$g->setJid(echapJid($jid));
if(!empty($messages)) {
$g->setStart(strtotime($messages[0]->published));
@ -156,7 +181,7 @@ class Chats extends WidgetBase
return $view->draw('_chats', true);
}
function prepareChat($jid)
function prepareChat($jid, $status = null)
{
if(!$this->validateJid($jid)) return;
@ -180,6 +205,8 @@ class Chats extends WidgetBase
$view->assign('caps', null);
}
$view->assign('status', $status);
$m = $md->getContact($jid, 0, 1);
if(isset($m)) {
$view->assign('message', $m[0]);

View file

@ -26,12 +26,16 @@
</span>
{/if}
<span>{$contact->getTrueName()}</span>
{if="isset($message)"}
<span class="info">{$message->published|strtotime|prepareDate}</span>
{if="preg_match('#^\?OTR#', $message->body)"}
<p><i class="zmdi zmdi-lock"></i> {$c->__('message.encrypted')}</p>
{else}
<p>{$message->body|prepareString|strip_tags}</p>
{if="isset($status)"}
<p>{$status}</p>
{else}
{if="isset($message)"}
<span class="info">{$message->published|strtotime|prepareDate}</span>
{if="preg_match('#^\?OTR#', $message->body)"}
<p><i class="zmdi zmdi-lock"></i> {$c->__('message.encrypted')}</p>
{else}
<p>{$message->body|prepareString|strip_tags}</p>
{/if}
{/if}
{/if}
</li>

View file

@ -4,6 +4,8 @@ empty = Open a new conversation by clicking on the plus button bello
add = Chat with a contact
frequent = Frequent contacts
more = Load more contacts
composing = Composing...
paused = Paused...
[message]
encrypted = Encrypted message

View file

@ -1,5 +1,5 @@
<div id="roster" ng-controller="RosterController as rosterCtrl">
<ul id="rosterlist" class="{if="isset($conf) && $conf.roster == 'show'"}offlineshown{/if} active all">
<ul id="rosterlist" class="{if="isset($conf) && isset($conf.roster) && $conf.roster == 'show'"}offlineshown{/if} active all">
<div ng-if="contacts == null" class="empty placeholder icon contacts">
<h1>{$c->__('roster.no_contacts_title')}</h1>
<h4>{$c->__('roster.no_contacts_text')}</h4>

View file

@ -51,7 +51,6 @@ $stdin_behaviour = function ($data) use (&$conn, $loop, &$buffer, &$connector, &
$config = $cd->get();
$port = 5222;
$dns = \Moxl\Utils::resolveHost($msg->host);
if(isset($dns[0]['target']) && $dns[0]['target'] != null) $msg->host = $dns[0]['target'];
if(isset($dns[0]['port']) && $dns[0]['port'] != null) $port = $dns[0]['port'];
@ -111,6 +110,7 @@ $xmpp_behaviour = function (React\Stream\Stream $stream) use (&$conn, $loop, &$s
} elseif($message == "<proceed xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>"
|| $message == '<proceed xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>') {
stream_set_blocking($conn->stream, 1);
stream_context_set_option($conn->stream, 'ssl', 'allow_self_signed', true);
$out = stream_socket_enable_crypto($conn->stream, 1, STREAM_CRYPTO_METHOD_TLS_CLIENT);
$restart = true;

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -25,10 +25,10 @@
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
#. extracted from ../app/widgets/Chats/locales.ini
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
#. extracted from ../app/widgets/Config/locales.ini
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
#. extracted from ../app/widgets/ConfigData/locales.ini
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
#. extracted from ../app/widgets/Config/locales.ini
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
#. extracted from ../app/widgets/Contact/locales.ini
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
#. extracted from ../app/widgets/Group/locales.ini
@ -45,10 +45,10 @@
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
#. extracted from ../app/widgets/Location/locales.ini
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
#. extracted from ../app/widgets/Login/locales.ini
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
#. extracted from ../app/widgets/LoginAnonymous/locales.ini
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
#. extracted from ../app/widgets/Login/locales.ini
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
#. extracted from ../app/widgets/Menu/locales.ini
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
#. extracted from ../app/widgets/NodeAffiliations/locales.ini
@ -81,17 +81,17 @@
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
#. extracted from ../app/widgets/Vcard4/locales.ini
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
#. extracted from ../app/widgets/Visio/locales.ini
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
#. extracted from ../app/widgets/VisioExt/locales.ini
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
#. extracted from ../app/widgets/Visio/locales.ini
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
#. extracted from ../locales/locales.ini
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-08-16 15:40+0200\n"
"POT-Creation-Date: 2015-08-20 15:17+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -584,11 +584,11 @@ msgstr ""
msgid "Encrypted message"
msgstr ""
#: [message]composing
#: [message]composing [chats]composing
msgid "Composing..."
msgstr ""
#: [message]paused
#: [message]paused [chats]paused
msgid "Paused..."
msgstr ""
@ -666,6 +666,26 @@ msgstr ""
msgid "Load more contacts"
msgstr ""
#: [title]data
msgid "Data"
msgstr ""
#: [title]cache
msgid "Cache"
msgstr ""
#: [title]contacts [menu]contacts [page]contacts
msgid "Contacts"
msgstr ""
#: [title]posts [page]posts
msgid "Posts"
msgstr ""
#: [title]messages
msgid "Messages"
msgstr ""
#: [config]general
msgid "General"
msgstr ""
@ -702,26 +722,6 @@ msgstr ""
msgid "Use desktop notifications"
msgstr ""
#: [title]data
msgid "Data"
msgstr ""
#: [title]cache
msgid "Cache"
msgstr ""
#: [title]contacts [menu]contacts [page]contacts
msgid "Contacts"
msgstr ""
#: [title]posts [page]posts
msgid "Posts"
msgstr ""
#: [title]messages
msgid "Messages"
msgstr ""
#: [general]legend [general]general_title
msgid "General Informations"
msgstr ""
@ -957,7 +957,7 @@ msgstr ""
#: [group]help_info2
msgid ""
"Choose a server and a Group and subscribe to it using the %s button in the "
"header. You can alse create a new one using the %s button."
"header. You can also create a new one using the %s button."
msgstr ""
#: [group]help_info3
@ -1181,6 +1181,10 @@ msgstr ""
msgid "Update my position"
msgstr ""
#: [login_anonymous]bad_username
msgid "Bad nickname (between 4 and 40 characters)"
msgstr ""
#: [error]username
msgid "Wrong username"
msgstr ""
@ -1309,10 +1313,6 @@ msgstr ""
msgid "Population"
msgstr ""
#: [login_anonymous]bad_username
msgid "Bad nickname (between 4 and 40 characters)"
msgstr ""
#: [menu]empty_title
msgid "No news yet..."
msgstr ""
@ -1784,18 +1784,6 @@ msgstr ""
msgid "Reset"
msgstr ""
#: [visio]call
msgid "Call"
msgstr ""
#: [visio]hang_up
msgid "Hang up"
msgstr ""
#: [visio]connection
msgid "Connection"
msgstr ""
#: [visio]hung_up
msgid "Hung up"
msgstr ""
@ -1812,6 +1800,18 @@ msgstr ""
msgid "Is calling you"
msgstr ""
#: [visio]call
msgid "Call"
msgstr ""
#: [visio]hang_up
msgid "Hang up"
msgstr ""
#: [visio]connection
msgid "Connection"
msgstr ""
#: [global]no_js
msgid "You don't have javascript enabled. Good luck with that."
msgstr ""

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -431,7 +431,7 @@ function getMood() {
'envious' => __('mood.envious'), // Feeling pain by the excellence or good fortune of another.
'excited' => __('mood.excited'), // Having great enthusiasm.
'flirtatious' => __('mood.flirtatious'), // In the mood for flirting.
'frustated' => __('mood.frustrated'), // Suffering from frustration; dissatisfied, agitated, or discontented because one is unable to perform an action or fulfill a desire.
'frustrated' => __('mood.frustrated'), // Suffering from frustration; dissatisfied, agitated, or discontented because one is unable to perform an action or fulfill a desire.
'grateful' => __('mood.grateful'), // Feeling appreciation or thanks.
'grieving' => __('mood.grieving'), // Feeling very sad about something, especially something lost; mournful; sorrowful.
'grumpy' => __('mood.grumpy'), // Unhappy and irritable.

View file

@ -339,7 +339,7 @@ header.big ~ .button.action {
@media screen and (min-width: 1025px) {
main > section > div:first-child:nth-last-child(2) .button.action {
right: calc(70% + 3rem);
right: calc(65% + 3rem);
}
}

View file

@ -180,7 +180,7 @@ body > nav li { /* Little hack for the navbar */
}
}
@media screen and (min-width: 1024px) {
@media screen and (min-width: 1024px) and (max-width: 1680px) {
body > nav:hover {
width: 45rem;
box-shadow: 0 2.5rem 5rem rgba(0,0,0,0.30), 0 2rem 1.5rem rgba(0,0,0,0.22);
@ -203,14 +203,12 @@ body > nav li { /* Little hack for the navbar */
@media screen and (min-width: 1680px) {
body > nav,
body > nav:hover {
width: 32rem;
box-shadow: none;
width: 15%;
}
body > nav + main,
body > nav:hover + main {
opacity: 1;
width: calc(100% - 32rem);
width: 85%;
}
}
@ -248,7 +246,7 @@ main > header {
main > header > div {
padding-left: 9rem;
position: relative;
width: 30%;
width: 35%;
display: inline-block;
/*overflow: hidden;*/
box-sizing: border-box;
@ -289,7 +287,7 @@ main > header > div > ul.active:not(.context_menu) li.thin span.icon {
}
main > header > div:first-child:nth-last-child(2) ~ div {
width: 70%;
width: 65%;
position: absolute;
top: 0;
right: 0;
@ -384,10 +382,10 @@ main > section > div > * {
/* Two blocks*/
main > section > div:first-child:nth-last-child(2) {
width: 30%;
width: 35%;
}
main > section > div:first-child:nth-last-child(2) ~ div {
width: 70%;
width: 65%;
position: absolute;
top: 0;
right: 0;