mirror of
https://github.com/YunoHost-Apps/movim_ynh.git
synced 2024-09-03 19:46:19 +02:00
Update to Movim 20150825
This commit is contained in:
parent
bab2000b0d
commit
937c811184
55 changed files with 47344 additions and 44567 deletions
|
@ -5,14 +5,11 @@ Movim is a decentralized social network, written in PHP and HTML5 and based on t
|
||||||
|
|
||||||
Warning: BETA.
|
Warning: BETA.
|
||||||
|
|
||||||
Current Movim version : 20150818.
|
Current Movim version : 20150824.
|
||||||
|
|
||||||
**Changelog**
|
**Changelog**
|
||||||
|
|
||||||
0.8.1b 2015-08-24
|
0.8b 2015-08-24
|
||||||
- Revert to Movim 20150818 to fix a bug (instant disconnect after login)
|
|
||||||
|
|
||||||
0.8b 2015-08-23
|
|
||||||
- Added language selection : ar, de, es, it, ja, nl, ru
|
- Added language selection : ar, de, es, it, ja, nl, ru
|
||||||
- Fix URL in manifest.json (was https://https://...)
|
- Fix URL in manifest.json (was https://https://...)
|
||||||
- Public/Private policy changed. The SSO portal is not used anymore
|
- Public/Private policy changed. The SSO portal is not used anymore
|
||||||
|
@ -20,7 +17,7 @@ Current Movim version : 20150818.
|
||||||
This change was necessary for public content (blog)
|
This change was necessary for public content (blog)
|
||||||
- Add dedicated php-fpm pool for Movim
|
- Add dedicated php-fpm pool for Movim
|
||||||
- Protect /log and /config properly
|
- Protect /log and /config properly
|
||||||
- Update to upstream Movim 20150821
|
- Update to upstream Movim 20150824
|
||||||
- Fix #6 and #7
|
- Fix #6 and #7
|
||||||
|
|
||||||
0.7b 2015-08-20
|
0.7b 2015-08-20
|
||||||
|
|
|
@ -224,7 +224,12 @@ function cleanJid($jid)
|
||||||
*/
|
*/
|
||||||
function explodeJid($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);
|
list($username, $server) = explode('@', $jid);
|
||||||
|
|
||||||
return array(
|
return array(
|
||||||
|
|
|
@ -259,9 +259,9 @@ class Contact extends Model {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setVcard4($vcard) {
|
public function setVcard4($vcard) {
|
||||||
if(isset($vcard->bday->date) && !empty((string)$vcard->bday->date))
|
if(isset($vcard->bday->date))
|
||||||
$this->date = (string)$vcard->bday->date;
|
$this->date = (string)$vcard->bday->date;
|
||||||
else
|
if(empty($this->date))
|
||||||
$this->date = null;
|
$this->date = null;
|
||||||
|
|
||||||
$this->name = (string)$vcard->nickname->text;
|
$this->name = (string)$vcard->nickname->text;
|
||||||
|
|
|
@ -359,6 +359,28 @@ class PostnDAO extends SQL {
|
||||||
return $this->run('ContactPostn');
|
return $this->run('ContactPostn');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function getMe($limitf = false, $limitr = false) {
|
||||||
|
$this->_sql = '
|
||||||
|
select *, postn.aid, privacy.value as privacy from postn
|
||||||
|
left outer join contact on postn.aid = contact.jid
|
||||||
|
left outer join privacy on postn.nodeid = privacy.pkey
|
||||||
|
where postn.origin = :origin and postn.node = \'urn:xmpp:microblog:0\'
|
||||||
|
order by postn.published desc
|
||||||
|
';
|
||||||
|
|
||||||
|
if($limitr)
|
||||||
|
$this->_sql = $this->_sql.' limit '.$limitr.' offset '.$limitf;
|
||||||
|
|
||||||
|
$this->prepare(
|
||||||
|
'Postn',
|
||||||
|
array(
|
||||||
|
'origin' => $this->_user
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return $this->run('ContactPostn');
|
||||||
|
}
|
||||||
function getPublic($origin, $node, $limitf = false, $limitr = false) {
|
function getPublic($origin, $node, $limitf = false, $limitr = false) {
|
||||||
$this->_sql = '
|
$this->_sql = '
|
||||||
select *, postn.aid, privacy.value as privacy from postn
|
select *, postn.aid, privacy.value as privacy from postn
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#chat_header.encrypted:after{
|
#chat_header.encrypted:after{
|
||||||
content: "";
|
content: "";
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
font-family: "Material Design Iconic Font";
|
font-family: "Material Design Iconic Font";
|
||||||
content: "\f041";
|
content: "\f041";
|
||||||
font-size: 2.5rem;
|
font-size: 2.5rem;
|
||||||
margin-left: 1rem;
|
margin-left: 1rem;
|
||||||
|
@ -19,7 +19,7 @@
|
||||||
#chat_widget .chat_box ul {
|
#chat_widget .chat_box ul {
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
max-width: 100rem;
|
max-width: 100rem;
|
||||||
margin-left: calc(50% - 51rem);
|
margin-left: calc(45% - 49rem);
|
||||||
}
|
}
|
||||||
|
|
||||||
#chat_widget .chat_box form {
|
#chat_widget .chat_box form {
|
||||||
|
@ -61,12 +61,16 @@
|
||||||
margin-top: 0.85rem;
|
margin-top: 0.85rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
#chat_widget li img {
|
#chat_widget li img:not(.emoji) {
|
||||||
max-height: 30rem;
|
max-height: 30rem;
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#chat_widget li img.emoji {
|
||||||
|
padding: 0 0.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
#chat_widget li.room {
|
#chat_widget li.room {
|
||||||
min-height: 3rem;
|
min-height: 3rem;
|
||||||
margin-bottom: 0.5rem;
|
margin-bottom: 0.5rem;
|
||||||
|
|
|
@ -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() {
|
Upload.attach(function() {
|
||||||
var textarea = document.querySelector('#chat_textarea');
|
var textarea = document.querySelector('#chat_textarea');
|
||||||
textarea.value = Upload.get + ' ' + textarea.value;
|
textarea.value = Upload.get + ' ' + textarea.value;
|
||||||
|
|
|
@ -1,10 +1,3 @@
|
||||||
<div id="chat_widget">
|
<div id="chat_widget" {if="$jid"}data-jid="{$jid}"{/if}>
|
||||||
{$c->prepareEmpty()}
|
{$c->prepareEmpty()}
|
||||||
{if="$jid"}
|
|
||||||
<script type="text/javascript">
|
|
||||||
MovimWebsocket.attach(function() {
|
|
||||||
Chat_ajaxGet('{$jid}');
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
{/if}
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -15,6 +15,8 @@ class Chats extends WidgetBase
|
||||||
$this->registerEvent('carbons', 'onMessage');
|
$this->registerEvent('carbons', 'onMessage');
|
||||||
$this->registerEvent('message', 'onMessage');
|
$this->registerEvent('message', 'onMessage');
|
||||||
$this->registerEvent('presence', 'onPresence', 'chat');
|
$this->registerEvent('presence', 'onPresence', 'chat');
|
||||||
|
$this->registerEvent('composing', 'onComposing');
|
||||||
|
$this->registerEvent('paused', 'onPaused');
|
||||||
}
|
}
|
||||||
|
|
||||||
function onMessage($packet)
|
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
|
* @brief Get history
|
||||||
*/
|
*/
|
||||||
|
@ -67,7 +92,7 @@ class Chats extends WidgetBase
|
||||||
$messages = $md->getContact(echapJid($jid), 0, 1);
|
$messages = $md->getContact(echapJid($jid), 0, 1);
|
||||||
|
|
||||||
$g = new \Moxl\Xec\Action\MAM\Get;
|
$g = new \Moxl\Xec\Action\MAM\Get;
|
||||||
$g->setJid($jid);
|
$g->setJid(echapJid($jid));
|
||||||
|
|
||||||
if(!empty($messages)) {
|
if(!empty($messages)) {
|
||||||
$g->setStart(strtotime($messages[0]->published));
|
$g->setStart(strtotime($messages[0]->published));
|
||||||
|
@ -156,7 +181,7 @@ class Chats extends WidgetBase
|
||||||
return $view->draw('_chats', true);
|
return $view->draw('_chats', true);
|
||||||
}
|
}
|
||||||
|
|
||||||
function prepareChat($jid)
|
function prepareChat($jid, $status = null)
|
||||||
{
|
{
|
||||||
if(!$this->validateJid($jid)) return;
|
if(!$this->validateJid($jid)) return;
|
||||||
|
|
||||||
|
@ -180,6 +205,8 @@ class Chats extends WidgetBase
|
||||||
$view->assign('caps', null);
|
$view->assign('caps', null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$view->assign('status', $status);
|
||||||
|
|
||||||
$m = $md->getContact($jid, 0, 1);
|
$m = $md->getContact($jid, 0, 1);
|
||||||
if(isset($m)) {
|
if(isset($m)) {
|
||||||
$view->assign('message', $m[0]);
|
$view->assign('message', $m[0]);
|
||||||
|
|
|
@ -26,12 +26,16 @@
|
||||||
</span>
|
</span>
|
||||||
{/if}
|
{/if}
|
||||||
<span>{$contact->getTrueName()}</span>
|
<span>{$contact->getTrueName()}</span>
|
||||||
{if="isset($message)"}
|
{if="isset($status)"}
|
||||||
<span class="info">{$message->published|strtotime|prepareDate}</span>
|
<p>{$status}</p>
|
||||||
{if="preg_match('#^\?OTR#', $message->body)"}
|
{else}
|
||||||
<p><i class="zmdi zmdi-lock"></i> {$c->__('message.encrypted')}</p>
|
{if="isset($message)"}
|
||||||
{else}
|
<span class="info">{$message->published|strtotime|prepareDate}</span>
|
||||||
<p>{$message->body|prepareString|strip_tags}</p>
|
{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}
|
||||||
{/if}
|
{/if}
|
||||||
</li>
|
</li>
|
||||||
|
|
|
@ -4,6 +4,8 @@ empty = Open a new conversation by clicking on the plus button bello
|
||||||
add = Chat with a contact
|
add = Chat with a contact
|
||||||
frequent = Frequent contacts
|
frequent = Frequent contacts
|
||||||
more = Load more contacts
|
more = Load more contacts
|
||||||
|
composing = Composing...
|
||||||
|
paused = Paused...
|
||||||
|
|
||||||
[message]
|
[message]
|
||||||
encrypted = Encrypted message
|
encrypted = Encrypted message
|
||||||
|
|
|
@ -20,6 +20,6 @@ subscriptions = Subscriptions
|
||||||
servers = Groups servers
|
servers = Groups servers
|
||||||
search_server = Search for a new server
|
search_server = Search for a new server
|
||||||
help_info1 = "Groups are the perfect way to share posts about topics that you like with all the other Movim's users."
|
help_info1 = "Groups are the perfect way to share posts about topics that you like with all the other Movim's users."
|
||||||
help_info2 = 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.
|
help_info2 = Choose a server and a Group and subscribe to it using the %s button in the header. You can also create a new one using the %s button.
|
||||||
help_info3 = Done? You can now publish a new post in the Group by using the %s button.
|
help_info3 = Done? You can now publish a new post in the Group by using the %s button.
|
||||||
help_info4 = You will find a list of all your subscribed Groups in My Subscriptions and receive instantly all the new incoming posts in the %sNews%s page.
|
help_info4 = You will find a list of all your subscribed Groups in My Subscriptions and receive instantly all the new incoming posts in the %sNews%s page.
|
||||||
|
|
|
@ -6,8 +6,9 @@
|
||||||
<div class="select">
|
<div class="select">
|
||||||
<select onchange="window[this.value].apply()" name="language" id="language">
|
<select onchange="window[this.value].apply()" name="language" id="language">
|
||||||
<option value="Menu_ajaxGetAll" selected="selected">{$c->__('menu.all')}</option>
|
<option value="Menu_ajaxGetAll" selected="selected">{$c->__('menu.all')}</option>
|
||||||
<option value="Menu_ajaxGetNews" >{$c->__('menu.groups')}</option>
|
<option value="Menu_ajaxGetNews">{$c->__('menu.groups')}</option>
|
||||||
<option value="Menu_ajaxGetFeed" >{$c->__('menu.contacts')}</option>
|
<option value="Menu_ajaxGetFeed">{$c->__('menu.contacts')}</option>
|
||||||
|
<option value="Menu_ajaxGetMe">{$c->__('menu.me')}</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -3,6 +3,7 @@ all = All
|
||||||
groups = Groups
|
groups = Groups
|
||||||
contacts = Contacts
|
contacts = Contacts
|
||||||
refresh = Refresh all the streams
|
refresh = Refresh all the streams
|
||||||
|
me = My publications
|
||||||
|
|
||||||
[roster]
|
[roster]
|
||||||
search = Search in your contacts
|
search = Search in your contacts
|
||||||
|
|
|
@ -75,6 +75,11 @@ class Menu extends WidgetBase
|
||||||
$this->ajaxGet('node', $server, $node, $page);
|
$this->ajaxGet('node', $server, $node, $page);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function ajaxGetMe($page = 0)
|
||||||
|
{
|
||||||
|
$this->ajaxGet('me', null, null, $page);
|
||||||
|
}
|
||||||
|
|
||||||
function ajaxGet($type = 'all', $server = null, $node = null, $page = 0)
|
function ajaxGet($type = 'all', $server = null, $node = null, $page = 0)
|
||||||
{
|
{
|
||||||
$html = $this->prepareList($type, $server, $node, $page);
|
$html = $this->prepareList($type, $server, $node, $page);
|
||||||
|
@ -129,6 +134,10 @@ class Menu extends WidgetBase
|
||||||
$view->assign('history', $this->call('ajaxGetFeed', $next));
|
$view->assign('history', $this->call('ajaxGetFeed', $next));
|
||||||
$items = $pd->getFeed($page * $this->_paging + $count, $this->_paging);
|
$items = $pd->getFeed($page * $this->_paging + $count, $this->_paging);
|
||||||
break;
|
break;
|
||||||
|
case 'me' :
|
||||||
|
$view->assign('history', $this->call('ajaxGetMe', $next));
|
||||||
|
$items = $pd->getMe($page * $this->_paging + $count, $this->_paging);
|
||||||
|
break;
|
||||||
case 'node' :
|
case 'node' :
|
||||||
$view->assign('history', $this->call('ajaxGetNode', '"'.$server.'"', '"'.$node.'"', '"'.$next.'"'));
|
$view->assign('history', $this->call('ajaxGetNode', '"'.$server.'"', '"'.$node.'"', '"'.$next.'"'));
|
||||||
$items = $pd->getNode($server, $node, $page * $this->_paging + $count, $this->_paging);
|
$items = $pd->getNode($server, $node, $page * $this->_paging + $count, $this->_paging);
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
<a class="classic" href="{$c->route('contact')}">
|
<a class="classic" href="{$c->route('contact')}">
|
||||||
<li {if="$page == 'contact'"}class="active"{/if}>
|
<li {if="$page == 'contact'"}class="active"{/if}>
|
||||||
<span class="icon"><i class="zmdi zmdi-accounts"></i></span>
|
<span class="icon"><i class="zmdi zmdi-accounts"></i></span>
|
||||||
<span class="counter"></span>
|
<span data-key="invite" class="counter"></span>
|
||||||
<span>{$c->__('page.contacts')}</span>
|
<span>{$c->__('page.contacts')}</span>
|
||||||
</li>
|
</li>
|
||||||
</a>
|
</a>
|
||||||
|
|
|
@ -76,11 +76,11 @@ var Notification = {
|
||||||
},
|
},
|
||||||
toast : function(html) {
|
toast : function(html) {
|
||||||
target = document.getElementById('toast');
|
target = document.getElementById('toast');
|
||||||
|
|
||||||
if(target) {
|
if(target) {
|
||||||
target.innerHTML = html;
|
target.innerHTML = html;
|
||||||
}
|
}
|
||||||
|
|
||||||
setTimeout(function() {
|
setTimeout(function() {
|
||||||
target = document.getElementById('toast');
|
target = document.getElementById('toast');
|
||||||
target.innerHTML = '';
|
target.innerHTML = '';
|
||||||
|
@ -91,11 +91,11 @@ var Notification = {
|
||||||
if(Notification.inhibed == true) return;
|
if(Notification.inhibed == true) return;
|
||||||
|
|
||||||
target = document.getElementById('snackbar');
|
target = document.getElementById('snackbar');
|
||||||
|
|
||||||
if(target) {
|
if(target) {
|
||||||
target.innerHTML = html;
|
target.innerHTML = html;
|
||||||
}
|
}
|
||||||
|
|
||||||
setTimeout(function() {
|
setTimeout(function() {
|
||||||
target = document.getElementById('snackbar');
|
target = document.getElementById('snackbar');
|
||||||
target.innerHTML = '';
|
target.innerHTML = '';
|
||||||
|
@ -105,7 +105,7 @@ var Notification = {
|
||||||
desktop : function(title, body, picture) {
|
desktop : function(title, body, picture) {
|
||||||
if(Notification.inhibed == true
|
if(Notification.inhibed == true
|
||||||
|| Notification.focused) return;
|
|| Notification.focused) return;
|
||||||
|
console.log(DesktopNotification);
|
||||||
var notification = new DesktopNotification(title, { icon: picture, body: body });
|
var notification = new DesktopNotification(title, { icon: picture, body: body });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,11 +37,20 @@ class Notifs extends WidgetBase
|
||||||
$this->registerEvent('presence_subscribed_handle', 'onNotifs');
|
$this->registerEvent('presence_subscribed_handle', 'onNotifs');
|
||||||
}
|
}
|
||||||
|
|
||||||
function onNotifs($packet = false)
|
function onNotifs($from = false)
|
||||||
{
|
{
|
||||||
$html = $this->prepareNotifs();
|
$html = $this->prepareNotifs();
|
||||||
RPC::call('movim_fill', 'notifs_widget', $html);
|
RPC::call('movim_fill', 'notifs_widget', $html);
|
||||||
RPC::call('Notifs.refresh');
|
RPC::call('Notifs.refresh');
|
||||||
|
|
||||||
|
if(is_string($from)) {
|
||||||
|
$cd = new \Modl\ContactDAO;
|
||||||
|
$contact = $cd->get($from);
|
||||||
|
|
||||||
|
$avatar = $contact->getPhoto('s');
|
||||||
|
if($avatar == false) $avatar = null;
|
||||||
|
Notification::append('invite|'.$from, $contact->getTrueName(), $this->__('notifs.wants_to_talk', $contact->getTrueName()), $avatar, 4);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function ajaxGet()
|
function ajaxGet()
|
||||||
|
@ -118,6 +127,7 @@ class Notifs extends WidgetBase
|
||||||
unset($notifs[$jid]);
|
unset($notifs[$jid]);
|
||||||
|
|
||||||
$session->set('activenotifs', $notifs);
|
$session->set('activenotifs', $notifs);
|
||||||
|
Notification::ajaxClear('invite|'.$jid);
|
||||||
}
|
}
|
||||||
|
|
||||||
function ajaxRefuse($jid)
|
function ajaxRefuse($jid)
|
||||||
|
@ -137,15 +147,6 @@ class Notifs extends WidgetBase
|
||||||
$session->set('activenotifs', $notifs);
|
$session->set('activenotifs', $notifs);
|
||||||
|
|
||||||
$this->onNotifs();
|
$this->onNotifs();
|
||||||
}
|
Notification::ajaxClear('invite|'.$jid);
|
||||||
|
|
||||||
function genCallAccept($jid)
|
|
||||||
{
|
|
||||||
return $this->call('ajaxAccept', "'".$jid."'");
|
|
||||||
}
|
|
||||||
|
|
||||||
function genCallRefuse($jid)
|
|
||||||
{
|
|
||||||
return $this->call('ajaxRefuse', "'".$jid."'");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@ class Rooms extends WidgetBase
|
||||||
function load()
|
function load()
|
||||||
{
|
{
|
||||||
$this->addjs('rooms.js');
|
$this->addjs('rooms.js');
|
||||||
|
$this->addcss('rooms.css');
|
||||||
$this->registerEvent('bookmark_set_handle', 'onBookmark');
|
$this->registerEvent('bookmark_set_handle', 'onBookmark');
|
||||||
$this->registerEvent('presence_muc_handle', 'onConnected');
|
$this->registerEvent('presence_muc_handle', 'onConnected');
|
||||||
$this->registerEvent('presence_unavailable_handle', 'onDisconnected');
|
$this->registerEvent('presence_unavailable_handle', 'onDisconnected');
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
{if="!$c->supported('anonymous') && $c->getView() != 'room'"}
|
{if="!$c->supported('anonymous') && $c->getView() != 'room'"}
|
||||||
<ul class="middle divided spaced active">
|
<ul class="thin divided spaced active">
|
||||||
<li class="subheader">
|
<li class="subheader">
|
||||||
{$c->__('chatrooms.title')}
|
{$c->__('chatrooms.title')}
|
||||||
<span class="info">{$conferences|count}</span>
|
<span class="info">{$conferences|count}</span>
|
||||||
|
@ -8,14 +8,14 @@
|
||||||
{$connected = $c->checkConnected($value->conference, $value->nick)}
|
{$connected = $c->checkConnected($value->conference, $value->nick)}
|
||||||
<li data-jid="{$value->conference}"
|
<li data-jid="{$value->conference}"
|
||||||
{if="$value->nick != null"} data-nick="{$value->nick}" {/if}
|
{if="$value->nick != null"} data-nick="{$value->nick}" {/if}
|
||||||
class="condensed room {if="$connected"}online{/if}">
|
class="room {if="$connected"}online{/if}">
|
||||||
{if="$connected"}
|
{if="$connected"}
|
||||||
<span class="icon bubble color {$value->name|stringToColor}"><i class="zmdi zmdi-accounts"></i></span>
|
<span class="icon small bubble color {$value->name|stringToColor}"><i class="zmdi zmdi-accounts"></i></span>
|
||||||
{else}
|
{else}
|
||||||
<span class="disabled icon bubble color {$value->name|stringToColor}"><i class="zmdi zmdi-accounts-outline"></i></span>
|
<span class="disabled icon small bubble color {$value->name|stringToColor}"><i class="zmdi zmdi-accounts-outline"></i></span>
|
||||||
{/if}
|
{/if}
|
||||||
<span>{$value->name}</span>
|
<span>{$value->name}</span>
|
||||||
<p>{$value->conference}</p>
|
<span class="second">{$value->conference}</span>
|
||||||
</li>
|
</li>
|
||||||
{/loop}
|
{/loop}
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@
|
||||||
<input
|
<input
|
||||||
type="submit"
|
type="submit"
|
||||||
value="{$c->__('button.come_in')}"
|
value="{$c->__('button.come_in')}"
|
||||||
class="button flat oppose"/>
|
class="button flat oppose"/>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</li>
|
</li>
|
||||||
|
|
3
sources/app/widgets/Rooms/rooms.css
Normal file
3
sources/app/widgets/Rooms/rooms.css
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
#rooms_widget ul li.room {
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
<div id="roster" ng-controller="RosterController as rosterCtrl">
|
<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">
|
<div ng-if="contacts == null" class="empty placeholder icon contacts">
|
||||||
<h1>{$c->__('roster.no_contacts_title')}</h1>
|
<h1>{$c->__('roster.no_contacts_title')}</h1>
|
||||||
<h4>{$c->__('roster.no_contacts_text')}</h4>
|
<h4>{$c->__('roster.no_contacts_text')}</h4>
|
||||||
|
|
|
@ -51,7 +51,6 @@ $stdin_behaviour = function ($data) use (&$conn, $loop, &$buffer, &$connector, &
|
||||||
$config = $cd->get();
|
$config = $cd->get();
|
||||||
|
|
||||||
$port = 5222;
|
$port = 5222;
|
||||||
|
|
||||||
$dns = \Moxl\Utils::resolveHost($msg->host);
|
$dns = \Moxl\Utils::resolveHost($msg->host);
|
||||||
if(isset($dns[0]['target']) && $dns[0]['target'] != null) $msg->host = $dns[0]['target'];
|
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'];
|
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'/>"
|
} elseif($message == "<proceed xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>"
|
||||||
|| $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_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);
|
$out = stream_socket_enable_crypto($conn->stream, 1, STREAM_CRYPTO_METHOD_TLS_CLIENT);
|
||||||
|
|
||||||
$restart = true;
|
$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
|
@ -25,10 +25,10 @@
|
||||||
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
|
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
|
||||||
#. extracted from ../app/widgets/Chats/locales.ini
|
#. extracted from ../app/widgets/Chats/locales.ini
|
||||||
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
|
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
|
||||||
#. extracted from ../app/widgets/Config/locales.ini
|
|
||||||
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
|
|
||||||
#. extracted from ../app/widgets/ConfigData/locales.ini
|
#. extracted from ../app/widgets/ConfigData/locales.ini
|
||||||
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
|
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
|
||||||
|
#. extracted from ../app/widgets/Config/locales.ini
|
||||||
|
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
|
||||||
#. extracted from ../app/widgets/Contact/locales.ini
|
#. extracted from ../app/widgets/Contact/locales.ini
|
||||||
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
|
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
|
||||||
#. extracted from ../app/widgets/Group/locales.ini
|
#. extracted from ../app/widgets/Group/locales.ini
|
||||||
|
@ -45,10 +45,10 @@
|
||||||
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
|
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
|
||||||
#. extracted from ../app/widgets/Location/locales.ini
|
#. extracted from ../app/widgets/Location/locales.ini
|
||||||
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
|
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
|
||||||
#. extracted from ../app/widgets/Login/locales.ini
|
|
||||||
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
|
|
||||||
#. extracted from ../app/widgets/LoginAnonymous/locales.ini
|
#. extracted from ../app/widgets/LoginAnonymous/locales.ini
|
||||||
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
|
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
|
||||||
|
#. extracted from ../app/widgets/Login/locales.ini
|
||||||
|
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
|
||||||
#. extracted from ../app/widgets/Menu/locales.ini
|
#. extracted from ../app/widgets/Menu/locales.ini
|
||||||
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
|
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
|
||||||
#. extracted from ../app/widgets/NodeAffiliations/locales.ini
|
#. extracted from ../app/widgets/NodeAffiliations/locales.ini
|
||||||
|
@ -81,17 +81,17 @@
|
||||||
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
|
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
|
||||||
#. extracted from ../app/widgets/Vcard4/locales.ini
|
#. extracted from ../app/widgets/Vcard4/locales.ini
|
||||||
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
|
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
|
||||||
#. extracted from ../app/widgets/Visio/locales.ini
|
|
||||||
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
|
|
||||||
#. extracted from ../app/widgets/VisioExt/locales.ini
|
#. extracted from ../app/widgets/VisioExt/locales.ini
|
||||||
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
|
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
|
||||||
|
#. extracted from ../app/widgets/Visio/locales.ini
|
||||||
|
#. #-#-#-#-# locales.po (PACKAGE VERSION) #-#-#-#-#
|
||||||
#. extracted from ../locales/locales.ini
|
#. extracted from ../locales/locales.ini
|
||||||
#, fuzzy
|
#, fuzzy
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \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"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
@ -584,11 +584,11 @@ msgstr ""
|
||||||
msgid "Encrypted message"
|
msgid "Encrypted message"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: [message]composing
|
#: [message]composing [chats]composing
|
||||||
msgid "Composing..."
|
msgid "Composing..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: [message]paused
|
#: [message]paused [chats]paused
|
||||||
msgid "Paused..."
|
msgid "Paused..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -666,6 +666,26 @@ msgstr ""
|
||||||
msgid "Load more contacts"
|
msgid "Load more contacts"
|
||||||
msgstr ""
|
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
|
#: [config]general
|
||||||
msgid "General"
|
msgid "General"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -702,26 +722,6 @@ msgstr ""
|
||||||
msgid "Use desktop notifications"
|
msgid "Use desktop notifications"
|
||||||
msgstr ""
|
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
|
#: [general]legend [general]general_title
|
||||||
msgid "General Informations"
|
msgid "General Informations"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -957,7 +957,7 @@ msgstr ""
|
||||||
#: [group]help_info2
|
#: [group]help_info2
|
||||||
msgid ""
|
msgid ""
|
||||||
"Choose a server and a Group and subscribe to it using the %s button in the "
|
"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 ""
|
msgstr ""
|
||||||
|
|
||||||
#: [group]help_info3
|
#: [group]help_info3
|
||||||
|
@ -1181,6 +1181,10 @@ msgstr ""
|
||||||
msgid "Update my position"
|
msgid "Update my position"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: [login_anonymous]bad_username
|
||||||
|
msgid "Bad nickname (between 4 and 40 characters)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: [error]username
|
#: [error]username
|
||||||
msgid "Wrong username"
|
msgid "Wrong username"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -1309,10 +1313,6 @@ msgstr ""
|
||||||
msgid "Population"
|
msgid "Population"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: [login_anonymous]bad_username
|
|
||||||
msgid "Bad nickname (between 4 and 40 characters)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: [menu]empty_title
|
#: [menu]empty_title
|
||||||
msgid "No news yet..."
|
msgid "No news yet..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -1784,18 +1784,6 @@ msgstr ""
|
||||||
msgid "Reset"
|
msgid "Reset"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: [visio]call
|
|
||||||
msgid "Call"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: [visio]hang_up
|
|
||||||
msgid "Hang up"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: [visio]connection
|
|
||||||
msgid "Connection"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: [visio]hung_up
|
#: [visio]hung_up
|
||||||
msgid "Hung up"
|
msgid "Hung up"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
@ -1812,6 +1800,18 @@ msgstr ""
|
||||||
msgid "Is calling you"
|
msgid "Is calling you"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: [visio]call
|
||||||
|
msgid "Call"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: [visio]hang_up
|
||||||
|
msgid "Hang up"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: [visio]connection
|
||||||
|
msgid "Connection"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: [global]no_js
|
#: [global]no_js
|
||||||
msgid "You don't have javascript enabled. Good luck with that."
|
msgid "You don't have javascript enabled. Good luck with that."
|
||||||
msgstr ""
|
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
|
@ -431,7 +431,7 @@ function getMood() {
|
||||||
'envious' => __('mood.envious'), // Feeling pain by the excellence or good fortune of another.
|
'envious' => __('mood.envious'), // Feeling pain by the excellence or good fortune of another.
|
||||||
'excited' => __('mood.excited'), // Having great enthusiasm.
|
'excited' => __('mood.excited'), // Having great enthusiasm.
|
||||||
'flirtatious' => __('mood.flirtatious'), // In the mood for flirting.
|
'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.
|
'grateful' => __('mood.grateful'), // Feeling appreciation or thanks.
|
||||||
'grieving' => __('mood.grieving'), // Feeling very sad about something, especially something lost; mournful; sorrowful.
|
'grieving' => __('mood.grieving'), // Feeling very sad about something, especially something lost; mournful; sorrowful.
|
||||||
'grumpy' => __('mood.grumpy'), // Unhappy and irritable.
|
'grumpy' => __('mood.grumpy'), // Unhappy and irritable.
|
||||||
|
|
|
@ -339,7 +339,7 @@ header.big ~ .button.action {
|
||||||
|
|
||||||
@media screen and (min-width: 1025px) {
|
@media screen and (min-width: 1025px) {
|
||||||
main > section > div:first-child:nth-last-child(2) .button.action {
|
main > section > div:first-child:nth-last-child(2) .button.action {
|
||||||
right: calc(70% + 3rem);
|
right: calc(65% + 3rem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
body > nav:hover {
|
||||||
width: 45rem;
|
width: 45rem;
|
||||||
box-shadow: 0 2.5rem 5rem rgba(0,0,0,0.30), 0 2rem 1.5rem rgba(0,0,0,0.22);
|
box-shadow: 0 2.5rem 5rem rgba(0,0,0,0.30), 0 2rem 1.5rem rgba(0,0,0,0.22);
|
||||||
|
@ -200,6 +200,18 @@ body > nav li { /* Little hack for the navbar */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@media screen and (min-width: 1680px) {
|
||||||
|
body > nav,
|
||||||
|
body > nav:hover {
|
||||||
|
width: 15%;
|
||||||
|
}
|
||||||
|
|
||||||
|
body > nav + main,
|
||||||
|
body > nav:hover + main {
|
||||||
|
width: 85%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
body > nav.active:before,
|
body > nav.active:before,
|
||||||
body > nav:hover:before {
|
body > nav:hover:before {
|
||||||
display: none;
|
display: none;
|
||||||
|
@ -234,7 +246,7 @@ main > header {
|
||||||
main > header > div {
|
main > header > div {
|
||||||
padding-left: 9rem;
|
padding-left: 9rem;
|
||||||
position: relative;
|
position: relative;
|
||||||
width: 30%;
|
width: 35%;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
/*overflow: hidden;*/
|
/*overflow: hidden;*/
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
|
@ -275,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 {
|
main > header > div:first-child:nth-last-child(2) ~ div {
|
||||||
width: 70%;
|
width: 65%;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0;
|
top: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
|
@ -370,10 +382,10 @@ main > section > div > * {
|
||||||
|
|
||||||
/* Two blocks*/
|
/* Two blocks*/
|
||||||
main > section > div:first-child:nth-last-child(2) {
|
main > section > div:first-child:nth-last-child(2) {
|
||||||
width: 30%;
|
width: 35%;
|
||||||
}
|
}
|
||||||
main > section > div:first-child:nth-last-child(2) ~ div {
|
main > section > div:first-child:nth-last-child(2) ~ div {
|
||||||
width: 70%;
|
width: 65%;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0;
|
top: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
|
@ -500,7 +512,7 @@ span.icon.large {
|
||||||
span.icon.small.bubble:first-letter,
|
span.icon.small.bubble:first-letter,
|
||||||
span.icon.small.bubble i {
|
span.icon.small.bubble i {
|
||||||
font-size: 2rem;
|
font-size: 2rem;
|
||||||
line-height: 0;
|
line-height: 1.5em;
|
||||||
vertical-align: text-top;
|
vertical-align: text-top;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue