initial commit.

This commit is contained in:
mntmn
2017-04-07 01:29:05 +02:00
commit 7ff2926578
258 changed files with 83743 additions and 0 deletions

24
views/artifact_list.html Normal file
View File

@@ -0,0 +1,24 @@
<html>
<body>
<h2>[[space.name]]</h2>
<table class="table table-striped" border=1>
<tr>
<th>created</th>
<th>updated</th>
<th>filetype</th>
<th>filename</th>
<th>preview</th>
</tr>
{% for a in space.artifacts %}
<tr>
<td>[[ a.created_at | date('d.m.Y H:i') ]] by [[ a.user.email ]][[ a.editor_name ]]</td>
<td>[[ a.updated_at | date('d.m.Y H:i') ]] by [[ a.update_user.email ]][[ a.last_update_editor_name ]]</td>
<td>[[ a.mime ]]</td>
<td>{% if a.payload_uri %}<a href="[[a.payload_uri]]">[[ a.filename ]]</a>{% endif %}</td>
<td>[[ a.description ]]</td>
</tr>
{% endfor %}
</table>
</body>
</html>

11
views/emails/action.html Normal file
View File

@@ -0,0 +1,11 @@
[[ text | safe ]]
{% if options.message %}
<p>
<i>[[options.message]]</i>
</p>
{% endif %}
{% if options.action %}<br><br>
<a href="[[options.action.link]]" target="_blank">[[options.action.name]]</a><br>
{% endif %}

3
views/error.html Normal file
View File

@@ -0,0 +1,3 @@
<h1>[[ message ]]</h1>
<h2>[[ error.status ]]</h2>
<pre>[[ error.stack ]]</pre>

26
views/facebook.html Normal file
View File

@@ -0,0 +1,26 @@
<!DOCTYPE html>
<html>
<head>
<title>[[space.name]]</title>
<meta charset="utf-8" />
<meta property="og:title" content="[[space.name]]" />
<meta property="og:description" content="" />
<meta property="og:updated_time" content="[[space.updated_at.getTime()]]" />
<meta property="og:type" content="website" />
<meta property="og:image" content="[[space.thumbnail_url]]" />
</head>
<body>
<h1>[[space.name]]</h1>
{% for a in space.artifacts %}
<tr>
<td>[[ a.mime ]]</td>
<td>[[ a.description | striptags ]]</td>
<td>{% if a.payload_uri %}<a href="[[ a.payload_uri ]]">download</a>{% endif %}</td>
</tr>
{% endfor %}
</body>
</html>

62
views/index.html Normal file
View File

@@ -0,0 +1,62 @@
{% extends 'layouts/outer.html' %}
{% block title %}[[ __("welcome") ]]{% endblock %}
{% block content %}
<div id="landing">
<div class="landing-keyvisual-wrapper">
<div class="landing-box">
<h2>[[__("landing_title")]]</h2>
<p class="lead">
<a href="/signup" class="btn btn-primary btn-block btn-xl">[[__("signup")]]</a>
</p>
<p class="lead">
<a href="/login" class="btn btn-primary btn-block btn-xl">[[__("login")]]</a>
</p>
<p class="lead">
[[__("landing_claim")]]
</p>
<p class="lead">
[[__("landing_example")]]
</p>
<ul>
<li class="lead">
[[__("landing_features_1") | safe ]]
</li>
<li class="lead">
[[__("landing_features_2") | safe ]]
</li>
<li class="lead">
[[__("landing_features_3") | safe ]]
</li>
<li class="lead">
[[__("landing_features_4") | safe ]]
</li>
<li class="lead">
[[__("landing_features_5") | safe ]]
</li>
<li class="lead">
[[__("landing_features_6") | safe ]]
</li>
<li class="lead">
[[__("landing_features_7") | safe ]]
</li>
</ul>
</div>
</div>
</div>
{% endblock %}

61
views/layouts/outer.html Normal file
View File

@@ -0,0 +1,61 @@
<!doctype html>
<html class="no-js">
<head>
<meta charset="utf-8">
<title>Spacedeck Open {% block title %}{% endblock %}</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<link href="[[ '/images/favicon.png' | cdn ]]" rel="icon" type="image/x-icon" />
<link href='https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,700,600,800,300|Montserrat:400,700|EB+Garamond|Vollkorn|Lato|Roboto|Source+Code+Pro|Ubuntu|Raleway|Playfair+Display|Crimson+Text' rel='stylesheet' type='text/css'>
<link type="text/css" rel="stylesheet" href="https://fast.fonts.net/cssapi/ee1a3484-4d98-4f9f-9f55-020a7b37f3c5.css"/>
<link rel="stylesheet" href="[[ '/stylesheets/style.css' | cdn ]]">
<script> var csrf_token = '[[ csrf_token ]]'; </script>
<script src="[[ '/javascripts/jquery-2.1.4.min.js' | cdn ]]"></script>
</head>
<body>
<!--[if lt IE 10]>
<p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
<![endif]-->
<header id="landing-header" class="header">
<div class="header-left">
<a class="btn btn-transparent btn-nude" href="[[config.endpoint]]/"><img src="[[ '/images/sd5-logo.svg' | cdn ]]" width="190"></a>
</div>
<div class="header-right pull-right">
{% if !user %}
<span class="btn-group dark round">
{% if (locale != "de") %}<a href="/t/de" rel="alternate" hreflang="de" class="btn btn-transparent btn-md">Deutsch</a>{% endif %}
{% if (locale != "en") %}<a href="/t/en" rel="alternate" hreflang="en" class="btn btn-transparent btn-md">English</a>{% endif %}
{% if (locale != "fr") %}<a href="/t/fr" rel="alternate" hreflang="fr" class="btn btn-transparent btn-md">Français</a>{% endif %}
</span>
<a class="btn btn-md btn-dark btn-round" href="/login">[[__("login")]]</a>
<a class="btn btn-md btn-blue btn-round" href="/signup">[[__("signup")]]</a>
{% else %}
<a class="btn btn-md btn-blue btn-round" href="/spaces">[[__("spaces")]]</a>
<a class="btn btn-md btn-dark btn-round" href="/logout">[[__("logout")]]</a>
{% endif %}
</div>
</header>
{% block content %}{% endblock %}
<div class="footer">
<p>
<div class="col-xs-6">
<a href="/contact">[[ __("contact") ]]</a>
<span style="color:#888">&copy; 20112017 The Spacedeck Open Developers</span>
</div>
</p>
</div>
</body>
</html>

11
views/not_found.html Normal file
View File

@@ -0,0 +1,11 @@
{% extends 'layouts/outer.html' %}
{% block title %}[[ __("not_found") ]]{% endblock %}
{% block content %}
<div id="landing" style="padding-top:200px;margin:auto;width:300px;">
<h1>[[__("not_found")]]</h1>
</div>
{% endblock %}

169
views/partials/account.html Normal file
View File

@@ -0,0 +1,169 @@
<div id="team" class="dialog in" style="padding:100px;z-index:20000;position:absolute;width:100%;min-height:100%;background-color:#eee" v-if="active_view == 'account' && user" v-cloak>
<a href="/spaces" class="btn btn-round btn-icon btn-stroke-darken btn-md pull-right" style="position:absolute;top:30px;right:30px"><span class="icon icon-cross-0"></span></a>
<div class="dialog-tabs" style="margin:auto">
<div class="dialog-tab" v-bind:class="{open:account=='profile'}" v-on:click="account='profile'"><span>[[__("profile_caption")]]</span></div>
<div class="dialog-tab" v-bind:class="{open:account=='language'}" v-on:click="account='language'"><span>[[__("language_caption")]]</span></div>
<div class="dialog-tab" v-bind:class="{open:account=='notifications'}" v-on:click="account='notifications'"><span>[[__("notifications_caption")]]</span></div>
<div class="dialog-tab" v-if="user.account_type=='email'" v-bind:class="{open:account=='password'}" v-on:click="account='password'"><span>[[__("password_caption")]]</span></div>
<div class="dialog-tab" v-bind:class="{open:account=='terminate'}" v-on:click="account='terminate'"><span>[[__("terminate_caption")]]</span></div>
</div>
<div class="dialog-section text-left" style="background-color:#f5f5f5;padding-top:40px;padding-bottom:40px">
<div class="collapse" v-bind:class="{in:account=='profile'}">
<div class="labels-inline relative" style="margin-bottom:40px">
<div class="form-group">
<div id="profile-image" class="img loaded pull-left" style="margin-right: 50px;">
<span id="profile-thumbnail" class="btn btn-xl btn-darken btn-icon btn-round" v-bind:style="{'background-image':'url('+user.avatar_thumb_uri+')'}">
<span class="icon icon-user" v-if="!user.avatar_thumb_uri"></span>
</span>
<span class="spinner"></span>
<button id="remove-profile-image" class="btn btn-xs btn-dark btn-round btn-icon" v-on:click="delete_user_avatar_image()" v-if="has_avatar_image(user)">
<span class="icon icon-cross-3"></span>
</button>
</div>
<div class="pull-left">
<div class="form-group">
<label class="file btn btn-md btn-darken" style="margin-right: 5px;">
<input type="file" v-on:change="save_user_avatar_image(this)">
<span v-if="!uploading_avatar">[[__("upload_avatar")]]</span>
<span v-if="uploading_avatar">[[__("uploading_avatar")]]</span>
</label>
<p class="message">[[__("avatar_dimensions")]]</p>
</div>
</div>
</div>
</div>
<div>
<div class="form-group">
<label class="label" >[[__("profile_name")]]</label>
<input type="text" id="user-nickname"
pattern=".{3,}"
required title="3 characters minimum"
class="input input-white no-b" data-i18n="[placeholder]account.username.input"
v-model="user.nickname" placeholder="Choose a username">
</div>
<div class="form-group">
<label class="label">[[__("profile_email")]]</label>
<input
id="new-email"
v-bind:class="{disabled: user.account_type=='google'}"
v-bind:disabled="user.account_type=='google'"
class="input input-white no-b"
type="email"
v-model="user.email"
v-on:change="user.email_changed=true"
placeholder="mail@example.com">
<button class="btn btn-md btn-darken" v-if="user.account_type=='email'" v-on:click=" save_user()" style="margin-top:20px">[[__("ok")]]</button>
</div>
<div class="form-group" v-if="!user.confirmed_at">
<p v-if="!user.confirmed_at && !account_confirmed_sent">[[__("confirmation_sent_long")]]</p>
<span
class="btn btn-xs btn-stroke-darken btn-round"
v-on:click=" confirm_again()"
v-if="!user.confirmed_at && !account_confirmed_sent"
>[[__("send_again")]]</span>
<p v-if="account_confirmed_sent">
<span class="icon icon-check"></span> <span>[[__("confirmation_sent_another")]]</span>
</p>
</div>
</div>
</div>
<div class="collapse" v-bind:class="{in:account=='language'}">
<div class="modal-section">
<label class="radio" v-bind:class="{checked
: user.preferences.language=='en'}" v-on:click="save_user_language('en')">
<input type="radio" id="user-preferences_language" name="language" value="en"><span>English</span>
</label>
<hr/>
<label class="radio" v-bind:class="{checked: user.preferences.language=='de'}" v-on:click="save_user_language('de')">
<input type="radio" id="user-preferences_language" name="language" value="de"><span>Deutsch</span>
</label>
<hr/>
<label class="radio" v-bind:class="{checked: user.preferences.language=='fr'}" v-on:click="save_user_language('fr')">
<input type="radio" id="user-preferences_language" name="language" value="fr"><span>Français</span>
</label>
</div>
</div>
<div class="collapse" v-bind:class="{in:account=='notifications'}">
<div class="modal-section labels-inline">
<div class="form-group">
<label class="checkbox"
v-bind:class="{checked: user.preferences.email_notifications}"
v-on:click="account_save_user_notifications(!user.preferences.email_notifications);">
<span>[[__('notifications_option_chat')]]</span>
</label>
</div>
</div>
</div>
<div class="collapse" v-bind:class="{in:account=='password'}">
<h4 class="modal-title">Change Password</h4>
<div class="modal-section labels-inline">
<div class="form-group">
<label class="label">[[__("current_password")]]</label>
<input id="current-password" class="input input-white no-b" v-model="password_change_current" type="password">
</div>
<div class="form-group">
<label class="label">[[__("new_password")]]</label>
<input id="new-password" class="input input-white no-b" v-model="password_change_new" type="password">
</div>
<div class="form-group">
<label class="label">[[__("verify_password")]]</label>
<input id="new-password-confirmation" class="input input-white no-b" v-model="password_change_new_confirmation" type="password">
</div>
<div class="center alert alert-danger" v-if="password_change_error">{{password_change_error}}</div>
</div>
<div class="modal-footer">
<div class="btn-cluster">
<button
class="btn btn-transparent btn-block"
v-on:click="save_user_password(password_change_current, password_change_new, password_change_new_confirmation);" >
[[__("change_password")]]
</button>
</div>
</div>
</div>
<div class="collapse" v-bind:class="{in:account=='terminate'}">
<div class="">
<p>[[__("terminate_warning")]]</p>
<p>[[__("terminate_warning2")]]</p>
</div>
<div class="labels-inline" v-if="user.account_type == 'email'">
<div class="form-group">
<label class="label">[[__("current_password")]]</label>
<input v-model="account_remove_password" class="input input-white no-b" type="password">
</div>
<div class="form-group">
<label class="label">[[__("terminate_reason")]]</label>
<textarea class="input input-white no-b" v-model="account_remove_feedback"></textarea>
<p class="message">[[__("terminate_reason_caption")]]</p>
</div>
<div class="center alert alert-danger" v-if="account_remove_error">{{account_remove_error}}</div>
</div>
<button class="btn btn-transparent btn-block" v-on:click="remove_account(account_remove_password, account_remove_feedback)">[[__("terminate_terminate")]]</button>
</div>
</div>
</div>

201
views/partials/folders.html Normal file
View File

@@ -0,0 +1,201 @@
<header id="folder-header" class="header" v-if="(active_view == 'folders' && active_folder)" v-cloak>
<div v-cloak class="header-left pull-left">
<a class="btn btn-stroke-darken btn-md btn-round btn-icon" href="/spaces">
<span class="icon icon-home"></span>
</a>
<button v-if="logged_in && (active_space_role == 'editor' || active_space_role == 'admin')" class="btn btn-primary btn-md btn-round" v-on:click="create_space('space')">[[ __('create_space') ]]</button>
<button v-if="logged_in && (active_space_role == 'editor' || active_space_role == 'admin')" class="btn btn-stroke-darken btn-md btn-round" v-on:click="create_space('folder')">
<span v-bind:class="{'disabled-pro':!is_pro(user)}">[[ __('create_folder') ]]</span>
</button>
</div>
<div class="header-right pull-right">
<div class="dropdown top light m-r-20 compact-hidden" v-bind:class="{open : active_dropdown=='folder_sorting'}">
<button class="btn btn-sm btn-nude" v-on:click="activate_dropdown('folder_sorting')">
<span>[[ __('sort_by') ]]</span>:
<b v-if="folder_sorting=='updated_at'">[[ __('last_modified') ]]</b>
<b v-if="folder_sorting=='name'">[[ __('title') ]]</b>
<b v-if="folder_sorting=='space_type'">[[ __('type') ]]</b>
</button>
<div class="dropdown-menu" role="menu">
<ul class="select-list">
<li v-bind:class="{checked:folder_sorting=='updated_at'}"
v-on:click="set_folder_sorting('updated_at',true)">
<span>[[ __('last_modified') ]]</span>
</li>
<li v-bind:class="{checked:folder_sorting=='name'}"
v-on:click="set_folder_sorting('name',false)">
<span>[[ __('title') ]]</span>
</li>
<li v-bind:class="{checked:folder_sorting=='space_type'}"
v-on:click="set_folder_sorting('space_type',false)">
<span>[[ __('type') ]]</span>
</li>
</ul>
</div>
</div>
<label class="relative compact-hidden">
<span class="icon icon-sm icon-zoom no-events absolute-top-left" style="margin: 5px;"></span>
<input id="folder-search"
type="search" name="search"
style="padding-left: 40px !important; margin-right: 10px;"
placeholder="[[ __('search') ]]"
class="input input-md input-white input-round no-b w-2"
v-model="folder_spaces_search" v-on:change="search_spaces">
</label>
<button class="btn btn-stroke-darken btn-md btn-round" v-if="!user.confirmed_at" v-on:click="confirm_again()">
<span v-if="!account_confirmed_sent">[[ __('email_unconfirmed') ]]</span>
<span v-if="account_confirmed_sent">[[ __('confirmation_sent') ]]</span>
</button>
<div class="dropdown top right light" v-bind:class="{open: active_dropdown=='account'}">
<button
class="profile-avatar btn btn-md btn-icon btn-darken btn-round"
v-bind:style="background_image_style([user.avatar_thumb_uri])"
v-bind:class="{'has-avatar-image':!!user.avatar_thumb_uri}" v-on:click="show_account();">
<span class="icon icon-user" v-if="logged_in && !user.avatar_thumb_uri"></span></button>
<div class="dropdown-menu" role="menu">
<ul class="select-list">
<li v-if="user.team && is_admin(user)">
<a href="/team">
<span class="icon icon-sm icon-user-group"></span>
<span>[[ __('edit_team') ]]</span>
</a>
</li>
<li>
<a href="/account">
<span class="icon icon-sm icon-user"></span>
<span>[[ __('edit_account') ]]</span>
</a>
</li>
<li v-on:click="activate_modal('support')">
<span>
<span class="icon icon-sm icon-info"></span>
<span>[[ __('support') ]]</span>
</span>
</li>
<li v-on:click="logout()">
<span>
<span class="icon icon-sm icon-logout"></span>
<span>[[ __('log_out') ]]</span>
</span>
</li>
</ul>
</div>
</div>
<div class="btn-group dark round" id="meta-toggle" style="margin-right:10px">
<button class="btn btn-md btn-transparent btn-icon btn-icon" v-on:click="toggle_meta()">
<span class="jewel" style="color: white; background-color: red" v-if="meta_unseen>0">{{meta_unseen}}</span>
<span class="icon icon-menu"></span>
</button>
</div>
</div>
</header>
<div id="profile" v-cloak v-if="active_view == 'folders' && user">
<div id="folder-wrapper">
<div id="folder-breadcrumb">
<a v-for="item in active_space_path" type="button" class="btn btn-sm btn-transparent" href="/{{item.space_type}}s/{{item._id}}" v-sd-droppable="handle_folder_drop;item">
<span>{{item.name}}</span>
<span class="seperator">/</span>
</a>
<a v-if="(active_space_role != 'admin')" type="button" class="btn btn-sm btn-transparent">
<span>{{active_folder.name}}</span>
</a>
<div class="dropdown top light" v-bind:class="{open:active_dropdown=='breadcrumb'}" v-if="(active_folder._id != user.home_folder_id) && ((active_space_role == 'admin') || (active_space_role == 'editor'))">
<button type="button" class="btn btn-sm btn-transparent btn-dropdown" data-toggle="dropdown" v-on:click=" activate_dropdown('breadcrumb')">
<span>{{active_folder.name}}</span>
</button>
<div class="dropdown-menu" v-if="active_folder && active_folder._id != user.home_folder_id">
<ul class="select-list">
<li><span class="tile-rename" v-on:click="rename_folder(active_folder)">[[__("rename")]]</span></li>
<li v-if="active_space_role == 'admin'"><span class="tile-share" v-on:click="activate_access()">[[__("share")]]</span></li>
<li><a v-on:click=" open_url('[[config.endpoint]]/api/spaces/'+active_folder._id+'/list')" target="_blank">[[__("list")]]</a></li>
</ul>
</div>
</div>
<div v-if="active_folder._id == user.home_folder_id">
<span>[[ __('home') ]]</span>
</div>
</div>
<div id="folder-empty" v-if="(active_profile_spaces.length == 0)">
<div>
<p>[[ __('no_spaces_yet') ]]</p>
</div>
</div>
<div id="folder-empty" v-if="folder_spaces_filter">
<div v-if="active_profile_spaces | empty?">
<p><b>"{{folder_spaces_filter}}"</b> <br/>[[ __('search_no_results') ]]</p>
<button type="button" class="btn btn-md btn-round btn-stroke-darken events" v-on:click=" folder_spaces_filter = ''">[[ __('search_clear') ]]</button>
</div>
</div>
<div id="folder-grid">
<div
v-for="item in active_profile_spaces | orderBy folder_sorting folder_reverse"
v-sd-draggable="item"
v-sd-droppable="handle_folder_drop;item"
draggable="true"
class="item" v-bind:class="item.space_type"
v-bind:style="{'z-index': (active_profile_spaces.length - $index)}">
<a href="/{{item.space_type}}s/{{item._id}}">
<span class="item-thumbnail thumbnail-loading" v-if="item.space_type=='space'"></span>
<span class="item-thumbnail" v-bind:style="space_thumbnail_style(item)"></span>
</a>
<div class="item-meta" >
<span class="item-title">{{item.name}}</span>
<div class="pull-right dropdown center light" v-if="active_space_role=='admin'" v-bind:class="{open:(active_dropdown=='space_'+item._id || active_dropdown=='space_share_'+item._id)}">
<button type="button" class="btn btn-transparent btn-dropdown no-min-w no-p" data-toggle="dropdown" v-on:click="activate_dropdown('space_'+item._id)">
</button>
<div class="dropdown-menu" role="menu">
<ul class="select-list">
<li v-on:click="duplicate_space(item)"><span><span class="icon icon-sm icon-duplicate"></span>[[ __('duplicate') ]]</span></li>
<li v-on:click="rename_space(item)"><span><span class="icon icon-sm icon-tag"></span>[[ __('rename') ]]</span></li>
<li v-on:click="delete_space(item)"><span><span class="icon icon-sm icon-trash"></span>[[ __('delete') ]]</span></li>
</ul>
</div>
</div>
</div>
<span class="item-appendix">
<span class="pull-right item-date">{{item.updated_at | date 'YYYY-MM-DD'}}</span>
<span class="item-author">
<span class="profile-avatar btn btn-xs btn-icon btn-white btn-round m-r-10"
v-bind:style="background_image_style([item.creator.avatar_thumb_uri])"
v-bind:class="{'has-avatar-image':!!item.creator.avatar_thumb_uri}">
<span class="icon icon-user" v-if="!item.creator.avatar_thumb_uri"></span>
</span>
{{item.creator.nickname}}
</span>
</span>
</div>
</div>
</div>
</div>

140
views/partials/login.html Normal file
View File

@@ -0,0 +1,140 @@
<header id="landing-header" class="header" v-cloak v-if="(active_view == 'login' || active_view == 'signup' || active_view == 'password-reset' || active_view == 'password-confirm')">
<div class="header-left">
<a class="btn btn-transparent btn-nude" href="/"><img src="/images/sd5-logo.svg" width="190"></a>
</div>
<div class="header-right pull-right">
<span class="btn-group dark round">
{% if (locale != "de") %}<a href="/t/de?r={{active_view}}" class="btn btn-transparent btn-md">Deutsch</a>{% endif %}
{% if (locale != "en") %}<a href="/t/en?r={{active_view}}" class="btn btn-transparent btn-md">English</a>{% endif %}
{% if (locale != "fr") %}<a href="/t/fr?r={{active_view}}" class="btn btn-transparent btn-md">Français</a>{% endif %}
</span>
<a class="btn btn-md btn-dark btn-round" href="/login">[[__("login")]]</a>
<a class="btn btn-md btn-blue btn-round" href="/signup">[[__("signup")]]</a>
</div>
</header>
<div id="account-forms"
v-bind:class="{'got-user':logged_in}"
v-cloak
v-if="(active_view == 'login' || active_view == 'signup' || active_view == 'password-reset' || active_view == 'password-confirm')">
<div id="login" v-bind:class="{active : active_view == 'login'}">
<div class="content">
<form v-on:submit="login_submit(user_forms_email, login_password, $event)">
<span class="btn btn-xs btn-darken pull-right" v-on:click="login_google();">[[__("login_google")]]</span>
<h4>[[__("login")]]</h4>
<div class="tight">
<div class="form-group">
<input class="input" name="email" type="email" required v-model="user_forms_email" placeholder="[[__("email")]]">
</div>
<div class="form-group">
<input class="input" name="password" type="password" required v-model="login_password" placeholder="[[__("password")]]">
</div>
</div>
<button type="submit" class="btn btn-primary btn-block">
<span v-show="!loading_user">[[__("login")]]</span>
<span v-show="loading_user">[[__("logging_in")]]</span>
</button>
<div class="center alert alert-danger" v-if="login_error">{{login_error}}</div>
<div class="pull-right">
<a class="btn btn-xs btn-darken" href="/signup">[[__("signup")]]</a>&nbsp;
<a class="btn btn-xs btn-darken" href="/password-reset">[[__("reset_password")]]</a>
</div>
</form>
</div>
</div>
<div id="signup" v-bind:class="{active : active_view == 'signup'}">
<div class="content">
<form v-on:submit="signup_submit($event, user_forms_name, user_forms_email, signup_password, signup_password_confirmation)">
<span class="btn btn-xs btn-darken pull-right" v-on:click="login_google();">[[__("login_google")]]</span>
<h4>[[__("signup")]]</h4>
<div class="tight">
<div class="form-group">
<input class="input" type="text" id="user-name" v-model="user_forms_name" placeholder="[[__("name")]]" v-focus autofocus>
</div>
</div>
<div class="tight">
<div class="form-group">
<input class="input" type="email" required id="user-email" v-model="user_forms_email" placeholder="[[__("email")]]">
</div>
<div class="form-group">
<input class="input" id="user-password" required type="password" v-model="signup_password" placeholder="[[__("password")]]">
</div>
<div class="form-group">
<input class="input" id="user-password-confirmation" required type="password" v-model="signup_password_confirmation" placeholder="[[__("password_confirmation")]]">
</div>
</div>
<div style="margin-top: -7px; margin-bottom: 7px;"><small>By signing up you agree to our <a href="/terms" target="_blank">TOS</a> and <a href="/privacy" target="_blank">Privacy Policy.</a></small><br/>
</div>
<button class="btn btn-primary btn-block">
<span v-if="!creating_user">[[__("signup")]]</span>
<span v-if="creating_user">[[__("signing_up")]]</span>
</button>
<div class="center alert alert-danger" style="width:100%;" v-if="signup_error">{{signup_error}}</div>
<a class="btn btn-link btn-block" href="/login" style="margin-top: 20px">[[__("login")]]</a>
</form>
</div>
</div>
<div id="password-reset" v-bind:class="{active : active_view == 'password-reset'}">
<div class="content" v-if="!password_reset_send">
<form>
<h4>Password Recovery</h4>
<div class="tight">
<div class="form-group">
<input class="input" type="email" id="user-email" v-model="reset_email" placeholder="[[__("email")]]">
</div>
</div>
<div class="text-center alert alert-danger" v-if="password_reset_error">{{password_reset_error}}</div>
<button class="btn btn-primary btn-block" v-on:click="password_reset_submit($event, reset_email)">[[__("reset_password")]]</button>
</form>
</div>
<div class="content" v-if="password_reset_send==true">
<h4>[[__("password_confirmation")]]</h4>
[[__("password_check_inbox")]]
</div>
</div>
<div id="password-confirm" v-bind:class="{active : active_view == 'password-confirm'}">
<div class="content">
<form>
<h4>Password Recovery</h4>
<div class="tight">
<div class="form-group">
<input class="input" id="user-password" type="password" v-model="signup_password" placeholder="[[__("password")]]">
</div>
<div class="form-group">
<input class="input" id="user-password" type="password" v-model="signup_password_confirmation" placeholder="[[__("password_confirmation")]]">
</div>
</div>
<div class="text-center alert alert-danger" v-if="password_reset_confirm_error">{{password_reset_confirm_error}}</div>
<button class="btn btn-primary btn-block" v-on:click="password_reset_confirm($event, signup_password, signup_password_confirmation)">[[__("save")]]</button>
</form>
</div>
</div>
</div>

View File

@@ -0,0 +1,55 @@
<div id="sidebar" v-bind:class="{in : meta_visible}" v-if="active_view=='folders' && active_folder" class="folder-sidebar">
<button class="btn btn-md btn-transparent btn-icon round pull-right" v-on:click="toggle_meta()" style="margin-top:15px;margin-right:20px">
<span class="icon icon-menu"></span>
</button>
<div class="sidebar-section" v-if="active_folder.creator">
<h4>{{active_folder.name}}</h4>
<div style="margin-bottom: 15px; margin-top: 8px" >
<small>
[[__("created_by")]] <b>{{active_folder.creator.nickname||active_folder.creator.slug}}.</b>
<br/>[[__("last_updated")]] <b>{{active_folder.updated_at | date 'MMMM Do YYYY, HH:mm'}}.</b>
</small>
</div>
<div v-if="logged_in && user.home_folder_id!=active_folder._id">
<button class="btn btn-sm btn-round btn-primary m-r-5" v-on:click="activate_access()">
<span class="icon-label">[[__("share")]]</span>
</button>
</div>
</div>
<div class="sidebar-section" v-if="is_pro(user)">
<h5>[[__("history_recently_updated")]]</h5>
<div v-if="active_folder_history_items.length == 0">
[[__("history_recently_empty")]]
</div>
<ul id="updates">
<li v-for="item in active_folder_history_items">
<a v-bind:href="'/spaces/' + item.space._id">{{item.space.name}}</a>
<small>
[[__("by")]]
<span v-for="u in item.users">{{u}}<span v-if="$index < (item.users.length-1)">, </span></span>
</small>
</li>
</ul>
</div>
<div class="sidebar-section" v-if="!is_pro(user)">
<h5>[[__("history_recently_updated")]]</h5>
<p>
[[__("pro_ad_history_headline")]]
</p>
<p>
<button class="btn btn-round btn-primary btn-md" v-on:click="show_upgrade_modal()">Upgrade</button>
</p>
</div>
</div>

71
views/partials/meta.html Normal file
View File

@@ -0,0 +1,71 @@
<div id="sidebar" v-bind:class="{in : meta_visible}" v-if="active_space_loaded && active_space">
<button class="btn btn-md btn-transparent btn-icon round pull-right" v-on:click="toggle_meta()" style="margin-top:15px;margin-right:20px">
<span class="icon icon-cross-0"></span>
</button>
<div class="sidebar-section" v-if="!logged_in && guest_nickname">
<!--h4>{{active_space.name}}</h4>
<div style="margin-bottom: 15px; margin-top: 8px" >
<small>
[[__("created_by")]] <b>{{active_space.creator.nickname}}.</b><br/>
[[__("last_updated")]] <b>{{active_space.updated_at | date 'MMMM Do YYYY, HH:mm'}}.</b>
</small>
</div-->
<div v-if="!logged_in && guest_nickname">
<button class="btn btn-sm btn-round btn-primary m-r-5"
v-on:click=" ask_guestname(guest_nickname);">
{{guest_nickname}}
</button>
<button class="btn btn-sm btn-round btn-primary m-r-5"
v-on:click="guest_logout()">
[[__("logout")]]
</button>
</div>
</div>
<div class="sidebar-section">
<h5>[[__("chat")]] &nbsp; <a v-if="active_space_role!='viewer'" v-on:click="activate_access()" class="btn btn-xs btn-darken">Add People</a></h5>
<textarea id="new-comment" style="min-height:80px;padding: 5px 9px;margin-bottom:10px" class="input input-darken no-b" v-if="can_add_comment" v-model="space_comment" placeholder="[[__("chat_message_placeholder")]]" spellcheck="false"></textarea>
<div v-if="can_add_comment">
<button class="btn btn-sm btn-primary" v-on:click="create_space_comment(space_comment)">[[__("post")]]</button>
</div>
<ul class="comments">
<li class="comment" v-for="item in active_space_messages | exceptFilter artifact_id | orderBy 'created_at' -1">
<ul class="comment-meta">
<li>
<a title="{{item.created_at | date 'MMMM Do YYYY, HH:mm'}}">
{{item.user.nickname}}
{{item.editor_name}}
</a>
</li>
<li
v-show="(active_space_role != 'viewer' || item.user_id==user._id)"
class="delete pull-right"
v-if="active_space_role!='viewer'"
v-on:click="remove_space_comment(item)">
<a title="[[__("delete")]]" style="cursor:pointer"></a>
</li>
</ul>
<span class="comment-author">
<a class="url" rel="contact" title="{{item.user.nickname}}">
<img class="btn btn-round btn-dark btn-sm btn-icon" v-bind:src="user_avatar_image(item.user)" v-if="has_avatar_image(item.user)">
<span class="btn btn-round btn-dark btn-sm btn-icon" v-if="!has_avatar_image(item.user)">
<span class="icon icon-user"></span>
</span>
</a>
</span>
<div class="comment-body" v-html="item.message"></div>
</li>
</ul>
</div>
</div>

View File

@@ -0,0 +1,124 @@
<div class="modal" v-if="active_modal == 'access' && access_settings_space" v-cloak>
<div class="modal-wrapper">
<div class="modal-dialog">
<div class="modal-content" style="width:760px">
<div class="modal-header" style="padding-bottom:0">
<h3 class="text-left"><span class="icon icon-share icon-sm"></span> [[__("share")]]: {{access_settings_space.name}}</h3>
<button type="button" class="btn btn-icon btn-light btn-round close" v-on:click=" close_modal()">
<span class="icon icon-cross-1"></span>
</button>
</div>
<div class="modal-body">
<div class="modal-section" style="padding-top:0;padding-bottom:20px">
<label class="radio" v-bind:class="{checked:access_settings_space.access_mode=='private'}">
<input type="radio" name="access_mode" value="private" v-model="access_settings_space.access_mode" v-on:click="save_space_access_mode($event)"> [[__("mode_private")]]
</label>
<label class="radio" v-bind:class="{checked:access_settings_space.access_mode=='public'}">
<input type="radio" name="access_mode" value="public" v-model="access_settings_space.access_mode" v-on:click="save_space_access_mode($event)">[[__("mode_public")]]
</label>
</div>
<div class="modal-section" v-if="active_space" style="padding-bottom:10px">
<h4 class="text-left"><span class="icon icon-link icon-sm"></span> [[__("access_editor_link")]] </h4>
<p class="text-left">
[[__("access_editor_link_desc")]]
</p>
<div class="input-group org-add-form">
<input id="editorurl2" type="text" class="form-control input input-lg" v-bind:value="share_base + '/s/' + access_settings_space.edit_hash + (access_settings_space.edit_slug ? '-' : '') + access_settings_space.edit_slug"/>
<span class="input-group-btn">
<span id="org-add-member" class="btn btn-lg btn-primary clipboard-btn" data-clipboard-target="#editorurl2" v-clipboard>
[[__("copy")]]
</span>
</span>
</div>
<label class="checkbox" v-bind:class="{checked:access_settings_space.editors_locking}">
<input
type="checkbox"
v-bind:checked="access_settings_space.editors_locking"
v-model="access_settings_space.editors_locking" v-on:change="save_space_editors_locking($event)" />
[[__("access_anonymous_edit_blocking")]]
</label>
</div>
<!-- subsection "invite" -->
<div id="new-editor" class="modal-section" style="padding-bottom:20px">
<h4 class="text-left"><span class="icon icon-user-add icon-sm"></span> [[__('access_new_members')]]</h4>
<div class="form-group">
<span class="error-note" v-if="invite_email_error">{{invite_email_error}}</span>
<input class="input input-block input-white"
v-bind:class="{error: !!invite_email_error}"
id="invitee_email"
v-model="invite_email"
type="email" placeholder="[[__('invite_emails')]]">
<textarea id="invite-message" class="input input-block input-white overflow-y-scroll"
v-model="invite_message" placeholder="[[__('optional_message')]]" name="Message"></textarea>
<select class="input input-white" v-model="invite_member_role">
<option value="viewer">[[__("role_viewer")]]</option>
<option value="editor">[[__("role_editor")]]</option>
<option value="admin">[[__("role_admin")]]</option>
</select>
</div>
<div class="form-group">
<button class="btn btn-primary btn-md btn-round" v-on:click="invite_member(access_settings_space, invite_email, invite_message, invite_member_role)"> [[__("invite")]] </button>
</div>
</div>
<!-- subsection "editors list" -->
<div class="modal-section" style="padding-bottom:60px">
<h4 class="text-left"><span class="icon icon-user-group icon-sm"></span> [[__("access_current_members")]]</h4>
<table class="table">
<tr>
<th></th>
<th>Email / Name</th>
<th>Role</th>
<th></th>
</tr>
<tr v-for="member in access_settings_memberships" v-bind:class="member.state">
<td>
<span class="editor-avatar btn btn-xs btn-round btn-icon" v-if="member.user">{{member.user.initials}}</span>
<span class="editor-avatar btn btn-xs btn-round btn-icon icon-hourglass" v-if="!member.user"></span>
</td>
<td>
<span class="editor-email" v-if="member.state == 'active'">{{member.user.email}}</span>
<span class="editor-email" v-if="member.state == 'pending'">{{member.email_invited}}</span>
<span class="editor-name" v-if="member.state == 'active'">{{member.user.nickname}}</span>
<span class="editor-email" v-if="member.state == 'pending'">(pending)</span>
</td>
<td>
<div class="form-group">
<select class="input input-sm" v-model="member.role" v-on:change="update_member(access_settings_space, member, $event.currentTarget.value)" style="width:auto">
<option value="viewer">[[__("role_viewer")]]</option>
<option value="editor">[[__("role_editor")]]</option>
<option value="admin">[[__("role_admin")]]</option>
</select>
</div>
</td>
<td>
<button class="btn btn-sm btn-stroke-darken" v-on:click="remove_member(access_settings_space, member)">[[__("delete")]]</button>
</td>
</tr>
</table>
<p class="text-left" v-if="!access_settings_memberships.length">
[[__("access_no_members")]]
</p>
<div class="form-group" style="padding-top: 40px">
<button class="btn btn-primary btn-md btn-round" v-on:click="close_modal();"> [[__("ok")]] </button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,35 @@
<div class="modal" v-if="active_modal == 'create-space'" v-cloak>
<div class="modal-wrapper">
<div class="modal-dialog">
<button type="button" class="btn btn-icon btn-light btn-round close" v-on="click : close_modal()">
<span class="icon icon-cross-1"></span>
</button>
<div class="modal-content">
<div class="modal-body labels-inline">
<div class="modal-section p-5">
What would you like to create?
<div>
<input type="text" v-model="create_space_title" placeholder="Title">
</div>
<div>
<button class="btn" v-on="click: create_space('space','whiteboard')">Whiteboard</button>
</div>
<div>
<button class="btn" v-on="click: create_space('space','collection')">Note Collection</button>
</div>
<div>
<button class="btn" v-on="click: create_space('space','article')">Article</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,43 @@
<div class="modal" v-if="active_modal == 'folder-settings'" v-cloak>
<div class="modal-wrapper">
<div class="modal-dialog top">
<div class="modal-content">
<div class="modal-header no-p">
<button type="button" class="btn btn-icon btn-light btn-round close" v-on:click="close_modal()">
<span class="icon icon-cross-1"></span>
</button>
<h4 class="modal-title">[[__("folder_settings")]]</h4>
</div>
<div class="modal-body">
<div class="modal-section">
<div class="form-group">
<label class="label">[[__("title")]]</label>
<input type="text" class="input" v-model="active_folder.name">
</div>
<div style="margin:auto;background-size:cover;background-position:50% 50%;border-radius:10px;margin-bottom:10px;width:200px;height:100px;background-image:url({{active_folder.avatar_thumb_uri}})" v-if="active_folder.avatar_thumb_uri">
</div>
<div class="progress state-processing" v-if="uploading_folder_avatar">
<div class="spinner"></div>
</div>
<div class="form-group text-center">
<label class="file btn btn-sm btn-round btn-stroke-darken">
<input type="file" id="file" v-on:change="save_folder_avatar_image(this);">
<span>[[__("upload_cover_image")]]</span>
</label>
</div>
</div>
<div class="modal-section">
<h4 class="modal-title" style="padding-top:0px">[[__("access_caption")]]</h4>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,84 @@
<div class="modal" v-if="active_modal == 'login'" v-cloak>
<div class="modal-wrapper">
<div class="modal-dialog">
<button type="button" class="btn btn-icon btn-light btn-round close" v-on:click="close_modal()">
<span class="icon icon-cross-1"></span>
</button>
<div class="modal-content">
<div class="modal-body">
<div class="modal-section no-b">
<div id="account-forms-modal">
<div v-show="active_modal_view != 'signup'">
<div class="content">
<form>
<h4>Login</h4>
<div class="tight">
<div class="form-group">
<input class="input" type="text" focus-me="true" v-model="login_email" placeholder="Email">
</div>
<div class="form-group">
<input class="input" type="password" v-model="login_password" placeholder="Password">
</div>
</div>
<span type="submit" class="btn btn-primary btn-xl btn-block btn-round" v-on:click="login_submit_modal(login_email, login_password, $event)">
<span v-show="!loading_user">Log In</span>
<span v-show="loading_user">Logging in…</span>
</span>
<div class="center alert alert-danger" v-if="login_error" v-model="login_error"></div>
<span class="btn btn-link btn-block" v-on:click="active_modal_view='signup'">Create a new account</span>
</form>
</div>
</div>
<div v-show="active_modal_view == 'signup'">
<div class="content">
<form>
<h4>Sign Up</h4>
<div class="tight">
<div class="form-group">
<input class="input" type="text" id="user-name" v-model="name" placeholder="Name">
</div>
<div class="form-group">
<input class="input" type="email" id="user-email" v-model="email" placeholder="Email">
</div>
<div class="form-group">
<input class="input" id="user-password" type="password" v-model="password" placeholder="Password">
</div>
<div class="form-group">
<input class="input" id="user-password-confirmation" type="password" v-model="password_confirmation" placeholder="Repeat Password">
</div>
</div>
<div class="text-center" style="margin-top: -7px; margin-bottom: 30px;"><small>By signing up you agree to our <a href="/terms.html" target="_blank">TOS</a> and <a href="/privacy.html" target="_blank">Privacy Policy.</a></small><br/>
</div>
<span class="btn btn-primary btn-xl btn-round btn-block" v-on:click="signup_submit_modal($event, name, email, password, password_confirmation)">
<span v-if="!creating_user">Sign Up</span>
<span v-if="creating_user">Signing Up…</span>
</span>
<div class="center alert alert-danger" v-if="signup_error">{{signup_error}}</div>
<span class="btn btn-link btn-block" v-on:click="active_modal_view='login'">I already have an account</span>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,36 @@
<div class="modal" v-if="active_modal == 'pdfoptions'" v-cloak>
<div class="modal-wrapper">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="btn btn-icon btn-light btn-round close" v-on:click=" close_modal()">
<span class="icon icon-cross-1"></span>
</button>
</div>
<div class="modal-body">
<p class="lead text-center">PDF Import</p>
<div class="plans-box">
<table class="plans-table">
<tr>
<td>
<p>Thumbnail and Download Link</p>
<button class="btn btn-primary btn-round btn-sm" v-on:click=" approve_pdf_upload($event, null, 'classic')">Classic Import</button>
</td>
<td>
<p>Each Page as Image, displayed as Grid</p>
<button class="btn btn-primary btn-round btn-sm" v-on:click=" approve_pdf_upload($event, pdf_export_with_zones, 'grid')">Grid Import</button><br>
<input type="checkbox" v-model="pdf_export_with_zones" /> With Zones?
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,24 @@
<div class="modal" v-if="active_modal == 'space-share'" v-cloak>
<div class="modal-wrapper">
<div class="modal-dialog">
<button type="button" class="btn btn-icon btn-light btn-round close" v-on="click : close_modal()">
<span class="icon icon-cross-1"></span>
</button>
<div class="modal-content">
<div class="modal-body">
<div class="modal-section no-b">
<p class="lead">Share &quot;{{active_space.name}}&quot;</p>
</div>
<div class="modal-section no-b">
<p class="lead">Or Copy &amp; Paste this Link</p>
<p>
<span class="input">{{share_base_url}}{{active_space._id}}</span>
</p>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,31 @@
<div class="modal" v-if="active_modal == 'support'" v-cloak>
<div class="modal-wrapper">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="btn btn-icon btn-light btn-round close" v-on:click="close_modal()">
<span class="icon icon-cross-1"></span>
</button>
<h4 class="modal-title">Send Feedback</h4>
</div>
<div class="modal-body">
<div class="modal-section">
<p>
Have a question, feedback or an idea for improvement? Send us a quick message using the box below and we'll get back to you as soon as possible.
</p>
<div class="form-group">
<textarea v-model="feedback_text" class="input" autofocus></textarea>
</div>
<div class="form-group">
<button class="btn btn-primary btn-round btn-sm" v-on:click="send_feedback(feedback_text)">Send Feedback</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,3 @@
<div class="dialog-section no-b" style="width: 420px;">
<p class="lead"> Share this with others</p>
</div>

View File

@@ -0,0 +1,135 @@
<div id="space" class="section board active mouse-{{mouse_state}} tool-{{active_tool}}">
<div class="space-bounds" style="width:{{active_space.advanced.width*bounds_zoom}}px;height:{{active_space.advanced.height*bounds_zoom}}px;"></div>
<div class="wrapper"
style="transform:scale({{viewport_zoom}});transform-origin:0 0;width:{{active_space.advanced.width}}px;height:{{active_space.advanced.height}}px;background-image:url('{{active_space.advanced.background_uri}}');background-color:{{active_space.advanced.background_color}};margin-left:{{bounds_margin_horiz}}px;margin-top:{{bounds_margin_vert}}px" >
<div v-repeat="a : active_space_artifacts"
v-class="text-editing:(editing_artifact_id==a._id && (a.view.major_type=='text' || a.view.major_type=='shape'))"
style="{{a.view.style}}"
class="{{a.view.classes}}"
id="artifact-{{a._id}}">
<div v-if="a.view && a.view.major_type" style="height:100%; width:100%">
<!-- text -->
<div v-if="a.view.major_type == 'text'" class="text" style="{{a.view.inner_style}}">
<div class="text-table">
<div class="text-cell" style="{{a.view.text_cell_style}}">
<div class="text-column" class="text-editing" v-sd-richtext="obj:a" v-if="editing_artifact_id==a._id">{{{a.description}}}</div>
<div class="text-column" v-if="editing_artifact_id!=a._id">{{{a.description|urls_to_links}}}</div>
</div>
</div>
</div>
<!-- drawing (annotation) -->
<div v-if="a.view.major_type == 'vector'" class="clip" style="{{a.view.inner_style}}">
<div>{{{a.view.vector_svg}}}</div>
</div>
<!-- svg shape -->
<div v-if="a.view.major_type == 'shape'" class="clip" style="{{a.view.inner_style}}">
<div class="shape">{{{a.view.vector_svg}}}</div>
<div class="text-table">
<div class="text-cell" style="{{a.view.text_cell_style}}">
<div class="text-column" v-sd-richtext="obj:a" v-class="text-editing:editing_artifact_id==a._id">{{{a.description}}}</div>
</div>
</div>
</div>
<!-- svg image -->
<div v-if="a.view.major_type == 'svg'" class="svg" style="{{a.view.inner_style}}">
<img v-attr="src : a.view.payload_uri"></img>
</div>
<!-- image -->
<div v-if="a.view.major_type == 'image'" class="image" style="{{a.view.inner_style}};background-image: url('{{a.view.thumbnail_uri}}');">
<span class="title">{{a.title}}</span>
<div class="spinner"></div>
<div class="progress" style="width:{{a.view.progress}}%">{{a.description}}</div>
<video v-if="a.mime == 'image/gif' && a.payload_alternatives && a.payload_alternatives.length > 0" preload autoplay loop>
<source v-repeat="rep : a.payload_alternatives" v-attr="src : rep.payload_uri, type : rep.mime" />
</video>
<!--span v-if="a.meta" class="link-wrapper"><a class="link btn btn-round btn-primary btn-sm" v-if="a.meta.link_uri" v-attr="href:a.meta.link_uri">{{a.view.link_caption}}</a></span-->
</div>
<!-- video -->
<div v-if="a.view.major_type == 'video'" v-videoplayer="a" class="video" style="{{a.view.inner_style}};background-image: url('{{a.view.thumbnail_uri}}');">
<video controls preload="metadata" v-attr="poster: a.view.thumbnail_uri">
<source v-repeat="rep : a.payload_alternatives" v-attr="src : rep.payload_uri, type : rep.mime" />
<source v-if="a.payload_uri && a.mime" v-attr="src : a.payload_uri, type : a.mime" />
</video>
<div class="spinner"></div>
<div class="progress" style="width:{{a.view.progress}}%">{{a.description}}</div>
</div>
<!-- audio -->
<div v-if="a.view.major_type == 'audio'" v-audioplayer="a" class="audio" style="{{a.view.inner_style}};">
<audio>
<source v-repeat="alt: a.payload_alternatives | orderBy 'mime' -1" v-attr="src: alt.payload_uri, type: alt.mime"/>
<source v-attr="src: a.payload_uri, type:a.mime" v-if="a.payload_uri"/>
</audio>
<div class="timeline" style="background-image: url('{{a.payload_thumbnail_web_uri}}')">
<div class="tl-current-time" style="width: {{a.player_view.current_time_float*100}}%"></div>
<div class="tl-inpoint" style="left: {{a.player_view.inpoint_float*100}}%" v-if="a.player_view.inpoint_float>0.0"></div>
<div class="tl-outpoint" style="left: {{a.player_view.outpoint_float*100}}%"></div>
</div>
<div class="tl-controls">
<div class="btn btn-md btn-toggle btn-round" v-class="alt:a.player_view.state=='playing'" v-show="a.board.w>=200 || a.player_view.state!='playing'">
<span class="btn-option play">
<span class="icon icon-controls-play"></span>
</span>
<span class="btn-option pause">
<span class="icon icon-controls-pause"></span>
</span>
</div>
<span class="btn btn-md btn-round btn-icon stop" v-show="a.player_view.state=='playing' || a.player_view.state=='paused'">
<span class="icon icon-controls-stop"></span>
</span>
<span class="tl-title" v-show="a.board.w>=250 && a.board.h>=150">{{a.view.filename}}</span>
<span class="tl-times" class="btn-group" v-show="a.board.w>=400 && a.board.h>=150">
<span class="btn btn-md btn-transparent no-p set-inpoint">{{a.player_view.current_time_string}} /</span>
<span class="btn btn-md btn-transparent no-p set-outpoint">{{a.player_view.total_time_string}}</span>
</span>
</div>
<div class="spinner"></div>
<div class="progress" style="width:{{a.view.progress}}%">{{a.description}}</div>
</div>
<!-- zone -->
<div v-if="a.view.major_type == 'zone'" class="zone" style="{{a.view.inner_style}}">
<div class="text-cell">
<div class="text-column" v-sd-richtext="obj:a" v-class="text-editing:editing_artifact_id==a._id">{{{a.description}}}</div>
</div>
</div>
<!-- embed -->
<div v-if="a.view.major_type == 'oembed'" class="oembed" style="{{a.view.inner_style}};background-color: #3d9ee9;padding:10px;word-wrap: break-word; text-align: center; color:white">
<span class="icon icon-video-camera"></span>
<a href="{{a.meta.link_uri}}" style="color: white;">{{a.meta.link_uri}}</a></p><!--v-html-->
</div>
<!-- file -->
<div v-if="a.view.major_type == 'file'" class="text" style="{{a.view.inner_style}}">
<span class="icon icon-page-vertical-double"></span>
{{a.view.filename}}
<div class="spinner"></div>
</div>
</div>
</div>
<!-- board artifacts end -->
</div>
<!-- wrapper end -->
</div>

493
views/partials/space.html Normal file
View File

@@ -0,0 +1,493 @@
<!-- FIXME modal -->
<div class="modal" v-if="(duplicate_folders.length > 0)" v-cloak>
<div class="modal-wrapper">
<div class="modal-dialog">
<button type="button" class="btn btn-icon btn-light btn-round close" v-on:click="duplicate_folders = []">
<span class="icon icon-cross-1"></span>
</button>
<div class="modal-content">
<div class="modal-body labels-inline">
<div class="modal-section">
<div class="form-group">
<label>
[[__("duplicate_destination")]]
</label>
</div>
<div class="form-group">
<select v-on:change="duplicate_folder_id=$event.target.value">
<option v-for="f in duplicate_folders" value="{{f._id}}">{{f.name}}</option>
</select>
</div>
<div class="form-group">
<button class="btn btn-md btn-round btn-primary" v-on:click="duplicate_folder_confirm(); ">
<span class="icon-label">[[__("ok")]]</span>
</button>
<button class="btn btn-md btn-round btn-darken pull-right" v-on:click="duplicate_folders = [];">
<span class="icon-label">[[__("cancel")]]</span>
</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div v-cloak class="header-left" v-show="active_space_loaded">
<div class="btn-group dark">
<div class="pull-left">
<a
class="btn btn-stroke-darken btn-md btn-round btn-icon"
title="[[__("home")]]" href="/spaces"
v-if="(logged_in && !embedded && !active_space.parent_space_id && !guest_nickname)">
<span class="icon icon-home"></span>
</a>
<a
class="btn btn-stroke-darken btn-md btn-round btn-icon"
title="[[__("parent_folder")]]"
href="/folders/{{active_space.parent_space_id}}"
v-if="(active_space.parent_space_id && !guest_nickname)">
<span class="icon icon-arrow-left-light"></span>
</a>
<input class="input input-md input-transparent w-auto"
id="space-title"
v-model="active_space.name" name="title" v-on:keydown="save_space_keydown($event)"
v-if="space_editing_title && logged_in" style="padding-right:0" v-focus>
<span class="input input-md input-transparent w-auto"
v-if="!space_editing_title && logged_in"
v-on:click="edit_space_title()">{{active_space.name}}</span>
<span v-if="!logged_in" class="btn btn-dark btn-round btn-md">{{active_space.name}}</span>
<button class="btn btn-md btn-transparent btn-icon" v-if="space_editing_title" v-on:click="save_space_keydown()">
<span class="icon icon-check"></span>
</button>
<div class="dropdown top left light" v-bind:class="{open: active_dropdown=='space'}">
<button class="btn btn-md btn-icon btn-dark" v-on:click="activate_dropdown('space')">
<span class="icon icon-triangle-down"></span></button>
<div class="dropdown-menu" role="menu">
<ul class="select-list">
<li v-on:click="activate_access()" v-if="logged_in">
<span>
<span class="icon icon-sm icon-share"></span>
<span>[[ __('share') ]]</span>
</span>
</li>
<li v-on:click="edit_space_title()" v-if="logged_in">
<span>
<span class="icon icon-sm icon-tag"></span>
<span>[[ __('rename') ]]</span>
</span>
</li>
<li v-on:click="duplicate_space_into_folder()" v-if="logged_in">
<span>
<span class="icon icon-sm icon-duplicate"></span>
<span>[[ __('duplicate') ]]</span>
</span>
</li>
<li v-on:click="download_space()">
<span>
<span class="icon icon-sm icon-download"></span>
<span>[[ __('download_space') ]]</span>
</span>
</li>
<li v-on:click="activate_modal('support')" v-if="logged_in">
<span>
<span class="icon icon-sm icon-info"></span>
<span>[[ __('support') ]]</span>
</span>
</li>
</ul>
</div>
</div>
</div>
</div>
<span class="btn btn-red btn-md" id="offline-indicator" v-bind:class="{offline: was_offline}" v-on:click="show_offline_help()">[[__("offline")]]</span>
</div>
<div v-cloak class="header-right" v-if="active_space_loaded">
<span v-for="active_user in active_space_users" >
<button
class="member btn btn-md btn-round"
v-cloak
v-bind:class="{'btn-dark': !active_user.avatar_thumb_uri}"
v-bind:style="{'background-image': 'url('+active_user.avatar_thumb_uri+')'}"
v-bind:title="active_user.nickname + ' is online'">
{{active_user.nickname}}
</button>
</span>
<div class="btn-group dark" v-if="active_space_role!='viewer'">
<button class="btn btn-md btn-transparent btn-icon" title="Start Presentation (others follow what you see)" v-on:click="toggle_present_mode()" v-bind:class="{open:present_mode}">
<span class="icon icon-presentation"></span>
</button>
</div>
<div class="btn-group dark round" v-if="zones.length">
<button class="btn btn-md btn-transparent btn-icon" v-on:click="go_to_previous_zone()" title="[[__("Previous Zone")]]">
<span class="icon icon-triangle-4-left"></span>
</button>
<button class="btn btn-md btn-divider"></button>
<button class="btn btn-md btn-transparent btn-icon" v-on:click="go_to_next_zone()" title="[[__("Next Zone")]]">
<span class="icon icon-triangle-4-right"></span>
</button>
</div>
<!--button class="btn btn-md btn-dark btn-round btn-icon" v-on:click="download_space()" title="[[__("download_space")]]">
<span class="icon icon-download"></span>
</button-->
<div class="btn-group dark" id="meta-toggle" style="margin-right:10px">
<button class="btn btn-md btn-transparent btn-icon" v-on:click="toggle_meta()" title="[[__("chat")]]">
<span class="jewel" style="color: white; background-color: red" v-if="meta_unseen>0">{{meta_unseen}}</span>
<span class="icon icon-messages"></span>
</button>
</div>
</div>
{% include "./tool/toolbar-elements.html" %}
{% include "./tool/toolbar-object.html" %}
<div v-if="active_space && active_space_loaded">
<div id="lasso"></div>
<div class="snap-ruler-h" v-bind:style="{top:snap_ruler_y+'px'}"></div>
<div class="snap-ruler-v" v-bind:style="{left:snap_ruler_x+'px'}"></div>
<div class="space-empty" v-cloak v-if="active_view == 'space' && !present_mode && active_space_artifacts.length == 0">
<div class="table-fake">
<div class="cell">
<p>Click anywhere to add content.<br>
You can also drop images, sounds and video<br>
or use copy and paste.</p>
</div>
</div>
</div>
</div>
<div id="space-loading" v-cloak v-bind:class="{active:loading_space_id, active:global_spinner}">
<div>
<div class="spinner"></div>
</div>
</div>
<div id="space" v-cloak
v-if="active_view == 'space' && active_space_loaded"
class="section board active mouse-{{mouse_state}} tool-{{active_tool}}"
v-bind:style="{'background-color': active_space.advanced.background_color}"
v-sd-droppable="handle_data_drop;active_space"
v-sd-whiteboard
v-on:scroll="handle_scroll"
v-on:dblclick="handle_space_doubleclick">
<div id="space-clipboard" style="position:fixed;top:0;left:0;z-index:0;opacity:0;background-color:white"><textarea v-model="selected_artifacts_json" cols="2" rows="2" id="clipboard-ta" class="mousetrap"></textarea></div>
<div class="space-bounds" v-bind:style="{width: active_space.advanced.width*bounds_zoom + 'px', height: active_space.advanced.height*bounds_zoom + 'px', 'background-color': active_space.advanced.background_color}"></div>
<div class="wrapper"
v-bind:style="{
transform: 'scale('+viewport_zoom+')',
'transform-origin': '0 0',
width: active_space.advanced.width + 'px',
height: active_space.advanced.height + 'px',
'background-image': (active_space.advanced.background_uri)?'url(' + active_space.advanced.background_uri + ')':'',
'background-color': ''+active_space.advanced.background_color,
'margin-left': bounds_margin_horiz + 'px',
'margin-top': bounds_margin_vert + 'px'}" >
<div v-for="a in active_space_artifacts"
v-bind:style="a.view.style" v-bind:class="a.view.classes"
v-bind:class="{text-editing:(editing_artifact_id==a._id && (a.view.major_type=='text' || a.view.major_type=='shape'))}"
id="artifact-{{a._id}}">
<div v-if="a.view && a.view.major_type" style="height:100%; width:100%" v-bind:title="(a.editor_name || (a.user && a.user.nickname) || '')">
<span v-if="a.locked && is_selected(a)" class="link-wrapper">
<span class="btn btn-sm btn-icon btn-round btn-primary">
<span class="icon icon-lock-closed"></span>
</span>
</span>
<!-- text -->
<div v-if="a.view.major_type == 'text'" class="text" v-bind:style="a.view.inner_style">
<div class="text-table">
<div class="text-cell" v-bind:style="a.view.text_cell_style">
<div class="text-column" class="text-editing" v-sd-richtext:obj="a" v-show="editing_artifact_id==a._id">{{{a.description}}}</div>
<div class="text-column" v-show="editing_artifact_id!=a._id">{{{a.description|urls_to_links}}}</div>
</div>
</div>
<span v-if="a.view.link.length>0" class="link-wrapper">
<a class="link btn btn-round btn-primary btn-sm" v-if="a.view.link" v-bind:href="a.view.link" target="_blank">{{a.view.link_caption}}</a>
</span>
<div class="btn btn-xs btn-icon btn-round btn-primary edit" v-show="editing_artifact_id!=a._id && is_selected(a)" v-on:touchstart="delayed_edit_artifact($event)"><span class="icon icon-pencil" v-on:click="toggle_selected_artifact_editing(true)" v-on:"touchstart:delayed_edit_artifact($event)"></span></div>
<input v-show="is_selected(a)" type="text" id="ios-focuser-{{a._id}}" class="ios-focuser">
</div>
<!-- drawing (annotation) -->
<div v-if="a.view.major_type == 'vector'" class="clip" v-bind:style="a.view.inner_style">
<div>{{{a.view.vector_svg}}}</div>
</div>
<!-- svg shape -->
<div v-if="a.view.major_type == 'shape'" class="clip" v-bind:style="a.view.inner_style">
<div class="shape">{{{a.view.vector_svg}}}</div>
<div class="text-table">
<div class="text-cell" v-bind:style="a.view.text_cell_style">
<div class="text-column" class="text-editing" v-sd-richtext:obj="a" v-show="editing_artifact_id==a._id"></div>
<div class="text-column" v-show="editing_artifact_id!=a._id">{{{a.description|urls_to_links}}}</div>
</div>
</div>
<span v-if="a.view.link.length>0" class="link-wrapper">
<a class="link btn btn-round btn-primary btn-sm" v-if="a.view.link" v-bind:href="a.view.link" target="_blank">{{a.view.link_caption}}</a>
</span>
<div class="btn btn-xs btn-icon btn-round btn-primary edit" v-show="editing_artifact_id!=a._id && is_selected(a)" v-on:touchstart="delayed_edit_artifact($event)"><span class="icon icon-pencil" v-on:click="toggle_selected_artifact_editing(true)" v-on:"touchstart:delayed_edit_artifact($event)"></span></div>
<input v-show="is_selected(a)" type="text" id="ios-focuser-{{a._id}}" class="ios-focuser">
</div>
<!-- svg image -->
<div v-if="a.view.major_type == 'svg'" class="svg" v-bind:style="a.view.inner_style">
<img v-bind:src="a.view.payload_uri"></img>
</div>
<!-- image -->
<div v-if="a.view.major_type == 'image'" class="image" v-bind:style="a.view.inner_style + '; background-image: url('+a.view.thumbnail_uri+');'">
<span class="title">{{a.title}}</span>
<div class="spinner"></div>
<div class="progress" v-bind:style="{width: a.view.progress+'%'}"></div>
<div class="progress-text">{{a.description}}</div>
<video v-if="a.mime == 'image/gif' && a.payload_alternatives && a.payload_alternatives.length > 0" preload autoplay loop>
<source v-for="rep in a.payload_alternatives" v-bind:src="rep.payload_uri" v-bind:type="rep.mime" />
</video>
<a class="btn btn-md btn-icon btn-round btn-primary edit"
v-show="a.mime == 'application/pdf'"
v-bind:href="a.payload_uri" target="_blank"
><span class="icon icon-link"></span></a>
<span v-if="a.view.link.length>0" class="link-wrapper">
<a class="link btn btn-round btn-primary btn-sm" v-if="a.view.link" v-bind:href="a.view.link" target="_blank">{{a.view.link_caption}}</a>
</span>
</div>
<!-- video -->
<div v-if="a.view.major_type == 'video'" v-videoplayer="a" class="video" v-bind:style="a.view.inner_style + ';background-image: url('+a.view.thumbnail_uri+');'">
<video preload="metadata" v-bind:poster="a.view.thumbnail_uri">
<source v-for="rep in a.payload_alternatives" v-bind:src="rep.payload_uri" v-bind:type="rep.mime" />
<source v-if="a.payload_uri && a.mime" v-bind:src="a.payload_uri" v-bind:type="a.mime" />
</video>
<div class="tl-controls">
<div class="btn btn-md btn-toggle btn-round" v-bind:class="{alt:a.player_view.state=='playing'}">
<span class="btn-option play">
<span class="icon icon-controls-play"></span>
</span>
<span class="btn-option pause">
<span class="icon icon-controls-pause"></span>
</span>
</div>
<span class="btn btn-md btn-round btn-icon stop" v-show="a.player_view.state=='playing' || a.player_view.state=='paused'">
<span class="icon icon-controls-stop"></span>
</span>
</div>
<div class="spinner"></div>
<div class="progress" v-bind:style="{width: a.view.progress+'%'}">{{a.description}}</div>
</div>
<!-- audio -->
<div v-if="a.view.major_type == 'audio'" v-audioplayer="a" class="audio" v-bind:style="a.view.inner_style">
<audio>
<source v-for="alt in a.payload_alternatives | orderBy 'mime' -1" v-bind:src="alt.payload_uri" v-bind:type="alt.mime"/>
<source v-bind:src="a.payload_uri" v-bind:type="a.mime" v-if="a.payload_uri"/>
</audio>
<div class="timeline" v-show="a.board.h>=64 && a.board.w>=170" v-bind:style="{'background-image': 'url(' + a.payload_thumbnail_web_uri +')'}">
<div class="tl-current-time" v-bind:style="{width: a.player_view.current_time_float*100 + '%'}"></div>
<div class="tl-inpoint" v-bind:style="{left: a.player_view.inpoint_float*100 + '%'}" v-if="a.player_view.inpoint_float>0.0"></div>
<div class="tl-outpoint" v-bind:style="{left: a.player_view.outpoint_float*100 + '%'}"></div>
</div>
<div class="tl-controls">
<div class="btn btn-md btn-toggle btn-round" v-bind:class="{alt:a.player_view.state=='playing'}">
<span class="btn-option play">
<span class="icon icon-controls-play"></span>
</span>
<span class="btn-option pause">
<span class="icon icon-controls-pause"></span>
</span>
</div>
<span class="btn btn-md btn-round btn-icon stop" v-show="a.player_view.state=='playing' || a.player_view.state=='paused'">
<span class="icon icon-controls-stop"></span>
</span>
<span class="tl-title" v-show="a.board.w>=400">{{a.view.filename}}</span>
<span class="tl-times" class="btn-group">
<span class="btn btn-md btn-transparent no-p">{{a.player_view.current_time_string}}</span>
<span class="btn btn-md btn-transparent no-p" v-show="a.board.w>=170"> / {{a.player_view.total_time_string}}</span>
</span>
<span v-show="logged_in && a.board.w>=310">
<a class="btn btn-xs btn-round btn-icon set-inpoint" title="Set Inpoint at Playhead">
<span class="icon icon-edge-left"></span>
</a>
<a class="btn btn-xs btn-round btn-icon set-outpoint" title="Set Outpoint at Playhead">
<span class="icon icon-edge-right"></span>
</a>
<a class="btn btn-xs btn-round btn-icon reset-points" title="Reset In-/Outpoints">
<span class="icon icon-size-horizontal"></span>
</a>
</span>
</div>
<div class="spinner"></div>
<div class="progress" v-bind:style="{width: a.view.progress + '%'}">{{a.description}}</div>
</div>
<!-- zone -->
<div v-if="a.view.major_type == 'zone'" class="zone" v-bind:style="a.view.inner_style">
<div class="text-cell">
<div class="text-column" class="text-editing" v-sd-richtext:obj="a" v-show="editing_artifact_id==a._id"></div>
<div class="text-column" v-show="editing_artifact_id!=a._id">{{{a.description|urls_to_links}}}</div>
</div>
</div>
<!-- embed -->
<div v-if="a.view.major_type == 'oembed'" class="oembed"
v-bind:style="{'background-image': 'url('+a.view.thumbnail_uri+')'}"
v-bind:class="{interactive:(a.view.interactive || present_mode)}">
{{{a.view.oembed_html}}}
<button class="btn btn-icon btn-primary btn-round interact" v-on:click="a.view.interactive=1" v-if="!a.view.interactive && !present_mode"><span class="icon icon-tool-pointer"></span></button>
</div>
<!-- file -->
<div v-if="a.view.major_type == 'file'" class="text" v-bind:style="a.view.inner_style">
<span class="icon icon-page-vertical-double"></span>
{{a.view.filename}}
<div class="spinner"></div>
</div>
</div>
</div>
<!-- board artifacts end -->
<div
class="handles handles-object"
v-bind:class="{'handles-vector':selection_metrics.vector_selection}"
v-bind:style="selection_metrics.style">
<div class="handle resize-nw"><div><div><div>
<span class="value-h">{{selection_metrics.h}}</span>
<span class="value-w">{{selection_metrics.w}}</span>
</div></div></div></div>
<div class="handle resize-n"><div><div><div>
<span class="value-h">{{selection_metrics.h}}</span>
</div></div></div></div>
<div class="handle resize-ne"><div><div><div>
<span class="value-h">{{selection_metrics.h}}</span>
<span class="value-w">{{selection_metrics.w}}</span>
</div></div></div></div>
<div class="handle resize-e"><div><div><div>
<span class="value-w">{{selection_metrics.w}}</span>
</div></div></div></div>
<div class="handle resize-se"><div><div><div>
<span class="value-h">{{selection_metrics.h}}</span>
<span class="value-w">{{selection_metrics.w}}</span>
</div></div></div></div>
<div class="handle resize-s"><div><div><div>
<span class="value-h">{{selection_metrics.h}}</span>
</div></div></div></div>
<div class="handle resize-sw"><div><div><div>
<span class="value-h">{{selection_metrics.h}}</span>
<span class="value-w">{{selection_metrics.w}}</span>
</div></div></div></div>
<div class="handle resize-w"><div><div><div>
<span class="value-w">{{selection_metrics.w}}</span>
</div></div></div></div>
<div class="edge-handle resize-n"> <span class="value-h">{{selection_metrics.h}}</span> </div>
<div class="edge-handle resize-s"> <span class="value-h">{{selection_metrics.h}}</span> </div>
<div class="edge-handle resize-e"> <span class="value-w">{{selection_metrics.w}}</span> </div>
<div class="edge-handle resize-w"> <span class="value-w">{{selection_metrics.w}}</span> </div>
<div
v-bind:style="selection_metrics.vector_style" v-show="selection_metrics.vector_points">
<span v-for="p in selection_metrics.vector_points" v-bind:style="{left: p.dx+'px', top: p.dy+'px'}" class="vector-handle" data-idx="{{$index}}"></span>
</div>
</div>
<!-- handles end -->
<div class="cursor" v-for="c in user_cursors" v-bind:style="{left: c.x + 'px', top: c.y+'px'}"><span class="btn btn-round btn-sm btn-dark"><span class="icon icon-tool-pointer"></span> {{c.name}}</div>
</div>
<!-- wrapper end -->
</div>
<div v-if="active_space_loaded" v-cloak>
<div id="minimap"
v-bind:style="{width: ''+(active_space.advanced.width/minimap_scale)+'px', height: ''+(active_space.advanced.height/minimap_scale)+'px', bottom: '66px', right: '20px'}"
v-if="active_space"
v-on:mousedown="handle_minimap_mousedown($event)"
v-on:touchstart="handle_minimap_mousedown($event)"
v-on:mousemove="handle_minimap_mousemove($event)"
v-on:touchmove="handle_minimap_mousemove($event)"
v-on:mouseleave="handle_minimap_mouseup($event)"
v-on:touchend="handle_minimap_mouseup($event)"
v-on:mouseup="handle_minimap_mouseup($event)">
<div v-for="a in active_space_artifacts" v-bind:style="{left: ''+(a.board.x/minimap_scale)+ 'px', top: ''+(a.board.y/minimap_scale) + 'px', width: ''+(a.board.w/minimap_scale)+ 'px', height: ''+(a.board.h/minimap_scale) + 'px'}"></div>
<div class="window" v-bind:style="{left: ''+(scroll_left/minimap_scale) + 'px', top: ''+(scroll_top/minimap_scale)+ 'px', width: ''+(window_width/minimap_scale)+ 'px', height: ''+(window_height/minimap_scale) + 'px'}"></div>
</div>
<div class="btn-group dark" style="position:absolute;bottom:20px;right:20px;">
<button class="btn btn-icon btn-md btn-transparent" v-on:click="zoom_in()">
<span class="icon icon-plus"></span>
</button>
<button class="btn btn-md btn-transparent no-p" v-on:click="zoom_to_original()">
{{viewport_zoom_percent}}%
</button>
<button class="btn btn-icon btn-md btn-transparent" v-on:click="zoom_out()">
<span class="icon icon-minus"></span>
</button>
</div>
</div>

91
views/partials/team.html Normal file
View File

@@ -0,0 +1,91 @@
<div id="team" class="dialog in" style="padding:100px;z-index:20000;position:absolute;width:100%;min-height:100%;background-color:#fafafa" v-if="active_view == 'team' && user" v-cloak>
<a href="/spaces" class="btn btn-round btn-icon btn-stroke-darken btn-md pull-right" style="position:absolute;top:30px;right:30px"><span class="icon icon-cross-0"></span></a>
<h4>Spacedeck Team Management</h4>
<div v-if="!user.team" class="dialog-section text-left">
You are not in a team yet. Please upgrade first.</h2>
</div>
<div v-if="user.team">
<div class="dialog-section">
<h4 class="text-left">[[__("team_name")]]</h4>
<div class="input-group org-add-form">
<input id="org-member-emails" v-model="user.team.name" class="form-control input input-lg" type="text">
<span class="input-group-btn">
<span id="org-add-member" class="btn btn-lg btn-primary" v-on:click=" team_save()">
[[__("save")]]
</span>
</span>
</div>
</div>
<div class="dialog-section">
<h4 class="text-left">[[__("subdomain")]]</h4>
<div class="input-group org-add-form">
<input v-model="user.team.subdomain" class="form-control input input-lg" type="text">
<span class="input-group-btn">
<span id="org-add-member" class="btn btn-lg btn-primary" v-on:click=" team_save()">
[[__("save")]]
</span>
</span>
</div>
</div>
<div class="dialog-section text-left">
<h4>Members</h4>
<p>
New members will get an invitation email. After the invitation was used, the member is active. The number of active members in your team will affect your monthly charge.
</p>
<div class="input-group org-add-form">
<input id="org-member-emails" v-model="team_emails" class="form-control input input-lg" type="email" placeholder="[[__("team_adresses")]]">
<span class="input-group-btn">
<span id="org-add-member" class="btn btn-lg btn-primary org-save" v-on:click=" team_invite_members(team_emails)">
<span v-if="!team_email_invited">[[__("add")]]</span>
<span v-if="team_email_invited">✓ [[__("invited")]]</span>
</span>
</span>
</div>
<table class="table table-striped table-condensed" v-if="team_members.length">
<thead>
<tr>
<th> [[__("email")]] </th>
<th> [[__("name")]] </th>
<th> [[__("role")]] </th>
<th></th>
</tr>
</thead>
<tbody class="members-list">
<tr v-for="u in team_members">
<td class="email">
<span>{{u.email}}</span>
</td>
<td class="display_name">
<span>{{u.nickname}}</span>
</td>
<td>
<span v-if="is_admin(u)">[[__("role_admin")]]</span>
<span v-if="!is_admin(u)">[[__("role_member")]]</span>
</td>
<td>
<span v-if="u._id != user._id" class="btn btn-sm btn-danger" v-on:click="team_remove_member(u)">[[__("remove")]]</span>
<span v-if="(u._id != user._id) && !is_admin(u)" class="btn btn-sm" v-on:click="team_promote_member(u)">[[__("promote")]]</span>
<span v-if="(u._id != user._id) && is_admin(u)" class="btn btn-sm" v-on:click="team_demote_member(u)">[[__("demote")]]</span>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>

View File

@@ -0,0 +1,16 @@
<h4 class="dialog-title">audio</h4>
<div id="audio">
<div class="dialog-section">
<label class="btn btn-xxl btn-transparent btn-icon">
<span class="icon icon-music-note"></span>
<input type="file" accept="audio/*" multiple v-on="change:handle_audio_file_upload($event)" id="audio_file_upload">
</label>
<p>Click to Upload<br/> or drag file(s) here</p>
</div>
<div class="dialog-section no-p-b">
<input type="text" v-model="audio_search_query" class="input input-md input-white input-round text-center no-p no-b no-r input-block" placeholder="Search / Paste URL" v-on="keyup:search_audio(audio_search_query) | key enter">
</div>
<button class="btn btn-transparent btn-block text-center" v-on="click:handle_insert_audio_url(audio_search_query)">Insert Audio</button>
</div>

View File

@@ -0,0 +1,112 @@
<div class="dialog-tabs-wrapper">
<div class="dialog-tabs">
<div class="dialog-tab" v-bind:class="{open:background_mode=='image'}" v-on:click="background_mode='image'"><span>[[__("background_image_caption")]]</span></div>
<div class="dialog-tab" v-bind:class="{open:background_mode=='color'}" v-on:click="background_mode='color'"><span>[[__("background_color_caption")]]</span></div>
</div>
</div>
<div id="background" class="relative">
<div id="colors" class="relative" v-show="background_mode!='image'">
<div class="color-picker" v-show="color_mode=='picker'">
<div class="color" id="background-color-picker" v-bind:style="{'background-color': 'hsl(' +color_picker_hue/255*360 + ', 100%, 50%)'}"
v-sd-fader="true"
sd-fader-var-x="color_picker_saturation"
sd-fader-var-y="color_picker_value"
sd-fader-max-x="255"
sd-fader-max-y="255">
<div class="fader-constraint mask" style="pointer-events:none" ></div>
<button class="fader-selector" style="pointer-events:none"></button>
</div>
<div class="color-hue"
v-sd-fader="true"
sd-fader-var-x="color_picker_hue">
<button class="fader-selector" style="pointer-events:none"></button>
</div>
<div class="color-opacity"
v-sd-fader="true"
sd-fader-var-x="color_picker_opacity">
<div class="fit"></div>
<button class="fader-selector" style="pointer-events:none"></button>
</div>
<div class="dialog-section no-p" id="color-rgba">
<div class="input-row">
<div>
<label class="color-hsva-hue">H</label>
<input class="input input-md input-nude text-center" v-model="color_picker_hue" spellcheck="false" maxlength="3" type="number">
</div>
<div>
<label class="color-hsva-saturation">S</label>
<input class="input input-md input-nude text-center" v-model="color_picker_saturation" spellcheck="false" maxlength="3" type="number">
</div>
<div>
<label class="color-hsva-brightness">V</label>
<input class="input input-md input-nude text-center" v-model="color_picker_value" spellcheck="false" maxlength="3" type="number">
</div>
<div>
<label class="color-hsva-alpha">A</label>
<input class="input input-md input-nude text-center" v-model="color_picker_opacity" spellcheck="false" maxlength="3" type="number">
</div>
</div>
</div>
</div>
<div class="color-palette" v-show="color_mode=='palette'">
<div class="adapt overflow-y-scroll">
<button class="btn btn-round btn-darken"
v-on:click="apply_swatch_color(s)"
v-for="s in swatches"
v-bind:style="{'background-color': s.hex}">
<span class="icon"></span>
</button>
</div>
</div>
</div>
<!--div class="dialog-section" v-show="background_mode=='color'">
<div class="tab-switch round options-2" v-bind:class="{'option-2':color_mode=='picker'}">
<div class="options">
<span class="option" v-on:click="activate_color_mode('palette')">[[__("palette")]]</span>
<span class="option" v-on:click="activate_color_mode('picker')">
<span>[[__("picker")]]</span>
</span>
</div>
<span class="option-highlight"></span>
</div>
</div-->
<div class="" v-show="background_mode=='image'" v-if="active_space">
<div class="background-image" v-bind:style="{height: '233px', 'background-image':'url('+active_space.advanced.background_uri+')', 'margin': '6px', 'border-radius': '3px'}" v-if="active_space.advanced.background_uri && !space_background_uploading">
</div>
<div class="progress state-processing" v-if="space_background_uploading">
<div class="spinner"></div>
</div>
<div class="dialog-section no-b adapt" v-if="!active_space.advanced.background_uri && !space_background_uploading" v-on:touchstart="handle_touch_select_background_image()">
<label class="btn btn-xxl btn-transparent btn-icon">
<span class="icon icon-picture-upload"></span>
<input id="background-uploader" type="file" accept="image/*" v-on:change="handle_section_background_upload($event)">
</label>
<p>[[__("upload_background_caption")]]</p>
</div>
<div class="dialog-section no-p no-flex" v-if="active_space.advanced.background_uri">
<div class="btn-cluster">
<label class="btn btn-transparent btn-block text-center" v-if="active_space.advanced.background_uri" v-on:touchstart="handle_touch_select_background_image()">
<input id="background-uploader" type="file" accept="image/*" v-on:chang="handle_section_background_upload($event)">
<span class="icon icon-picture-upload"></span>
<!-- Upload -->
</label>
<button class="btn btn-transparent text-center" v-on:click="remove_section_background()" >
<span class="icon icon-trash"></span>
<!-- Remove -->
</button>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,28 @@
<h4 class="dialog-title">Padding</h4>
<div id="canvas">
<div class="dialog-section no-p-b no-p-h">
<div class="input-couple">
<div>
<div class="form-group no-m">
<label class="label label-sm text-right">Horizontal</label>
<input class="input no-b no-p text-right" spellcheck="false" type="text" value="0" pattern="[0-9]" maxlength="6" v-model="active_version.advanced.padding_horiz">
<button tabindex="-1" class="input-drag btn btn-transparent btn-icon" v-sd-fader="true" sd-fader-var-y="active_version.advanced.padding_horiz" sd-fader-min-y="0" sd-fader-max-y="1000" sd-fader-step="1">
<span class="icon icon-triangles-vertical"></span>
</button>
<!-- <span class="input-unit">px</span> -->
</div>
</div>
<div>
<div class="form-group no-m">
<label class="label label-sm text-left">Vertical</label>
<input class="input no-b no-p text-left" spellcheck="false" type="text" value="0" pattern="[0-9]" maxlength="6" ng-model="active_version.advanced.height">
<button class="input-drag btn btn-transparent btn-icon absolute-bottom-right" sd-fader="y-encoder" sd-fader-var-y="active_version.advanced.height" sd-fader-min-y="100" sd-fader-max-y="20000" sd-fader-step="10">
<span class="icon icon-triangles-vertical"></span>
</button>
<!-- <span class="input-unit">px</span> -->
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,152 @@
<div id="colors" class="relative">
<div class="color-picker" v-bind:class="{invis : color_mode=='palette'}">
<div class="color" id="fg-color-picker" v-bind:style="{'background-color': 'hsl(' + color_picker_hue/255*360 + ', 100%, 50%)'}"
v-sd-fader="true"
sd-fader-var-x="color_picker_saturation"
sd-fader-var-y="color_picker_value"
sd-fader-max-x="255"
sd-fader-max-y="255">
<div class="fader-constraint mask" style="pointer-events:none" ></div>
<button class="fader-selector" style="pointer-events:none"></button>
</div>
<div class="color-hue"
v-sd-fader="true"
sd-fader-var-x="color_picker_hue">
<button class="fader-selector" style="pointer-events:none"></button>
</div>
<div class="color-opacity"
v-sd-fader="true"
sd-fader-var-x="color_picker_opacity">
<div class="fit"></div>
<button class="fader-selector" style="pointer-events:none"></button>
</div>
<div class="dialog-section no-p" id="color-rgba">
<div class="input-row">
<div>
<label class="color-hsva-hue">H</label>
<input class="input input-md input-nude text-center" v-model="color_picker_hue" spellcheck="false" maxlength="3" type="number">
</div>
<div>
<label class="color-hsva-saturation">S</label>
<input class="input input-md input-nude text-center" v-model="color_picker_saturation" spellcheck="false" maxlength="3" type="number">
</div>
<div>
<label class="color-hsva-brightness">V</label>
<input class="input input-md input-nude text-center" v-model="color_picker_value" spellcheck="false" maxlength="3" type="number">
</div>
<div>
<label class="color-hsva-alpha">A</label>
<input class="input input-md input-nude text-center" v-model="color_picker_opacity" spellcheck="false" maxlength="3" type="number">
</div>
</div>
</div>
<!-- <div class="dialog-section no-p" id="color-hex">
<button id="add-remove-color" class="btn btn-toggle btn-transparent btn-icon" >
<span class="btn-option">
<span class="icon icon-circle-check"></span>
</span>
<span class="btn-option" >
<span class="icon icon-trash"></span>
</span>
</button>
<div id="color-hash">
<label class="hash">#</label>
<input class="input" v-model="color_picker_rgb" spellcheck="false" maxlength="6" type="text">
</div>
</div> -->
</div>
<div class="color-palette r-10" v-bind:class="{invis:color_mode!='palette'}">
<div class="adapt overflow-y-scroll">
<button class="btn btn-round btn-darken"
v-on:click="apply_swatch_color(s)"
v-for="s in swatches"
v-bind:style="{'background-color': s.hex}">
<span class="icon" v-bind:class="{'icon-cross-0':s.hex=='rgba(0,0,0,0)'}"></span>
</button>
</div>
</div>
</div>
<!--div class="dialog-section no-b" style="margin-top:-10px">
<div class="tab-switch round options-2" v-bind:class="{'option-2':color_mode=='picker'}">
<div class="options">
<span class="option" v-on:click="activate_color_mode('palette')">[[__("palette")]]</span>
<span class="option" v-on:click="activate_color_mode('picker')">
<span>[[__("picker")]]</span>
</span>
</div>
<span class="option-highlight"></span>
</div>
</div-->
<!--div class="dialog-section no-p-h no-p-b" v-show="opened_dialog=='color-fill'">
<div class="form-group no-m">
<label class="label label-sm">Padding</label>
<input class="input no-b no-p text-center text-large" spellcheck="false" type="number" pattern="[0-9]" maxlength="64" value="250" v-model="active_style.padding">
<button tabindex="-1" class="input-drag btn btn-transparent btn-icon" style="cursor: ns-resize;" v-sd-fader="true" sd-fader-var-y="active_style.padding" sd-fader-min-y="0" sd-fader-max-y="500" sd-fader-step="1">
<span class="icon icon-triangles-vertical"></span>
</button>
<span class="input-unit">px</span>
</div>
</div-->
<div class="dialog-section no-p-h no-p-b" v-show="opened_dialog=='color-stroke'">
<div class="input-row">
<div class="form-group no-m">
<label class="label label-sm">Stroke</label>
<input class="input no-b no-p text-center text-large" spellcheck="false" type="number" v-model="active_style.stroke">
<button tabindex="-1" class="input-drag btn btn-transparent btn-icon" v-sd-fader="true" sd-fader-var-y="active_style.stroke" sd-fader-min-y="0" sd-fader-max-y="100" sd-fader-step="1">
<span class="icon icon-triangles-vertical"></span>
</button>
<span class="input-unit">px</span>
</div>
<div class="form-group no-m">
<label class="label label-sm">Border Radius</label>
<input class="input no-b no-p text-center text-large" spellcheck="false" type="number" v-model="active_style.border_radius">
<button tabindex="-1" class="input-drag btn btn-transparent btn-icon" v-sd-fader="true" sd-fader-var-y="active_style.border_radius" sd-fader-min-y="0" sd-fader-max-y="500" sd-fader-step="1">
<span class="icon icon-triangles-vertical"></span>
</button>
<span class="input-unit">px</span>
</div>
</div>
</div>
<div class="dialog-section no-p-b no-p-h" v-show="opened_dialog=='color-text'">
<div class="input-row">
<div class="form-group no-m">
<label class="label label-sm text-center">[[__("font_size")]]</label>
<input class="input no-b no-p text-center text-large" spellcheck="false" type="text" pattern="[0-9]" maxlength="64" v-model="active_style.font_size">
<!--button tabindex="-1" class="input-drag btn btn-transparent btn-icon" style="cursor: ns-resize;" v-sd-fader="true" sd-fader-var-y="active_style.font_size" sd-fader-min-y="8" sd-fader-max-y="400" sd-fader-sens="0.2">
<span class="icon icon-triangles-vertical"></span>
</button-->
<span class="input-unit">px</span>
</div>
<div class="form-group no-m">
<span class="font-size-swatches" v-show="opened_dialog=='color-text'">
<button class="btn btn-sm" v-on:click="apply_font_size(64)" style="font-size:32px">Big</button>
<button class="btn btn-sm" v-on:click="apply_font_size(32)" style="font-size:24px">Medium</button>
<button class="btn btn-sm" v-on:click="apply_font_size(18)" style="font-size:14px">Small</button>
</span>
</div>
<!--div class="form-group no-m">
<label class="label label-sm text-center">[[__("line_height")]]</label>
<input disabled class="input no-b no-p text-center text-large" spellcheck="false" type="text" pattern="[0-9\.]" maxlength="64" v-model="active_style.line_height">
<button tabindex="-1" class="input-drag btn btn-transparent btn-icon" style="cursor: ns-resize;" v-sd-fader="true" sd-fader-var-y="active_style.line_height" sd-fader-min-y="0.5" sd-fader-max-y="4" sd-fader-step="0.1">
<span class="icon icon-triangles-vertical"></span>
</button>
<span class="input-unit">em</span>
</div-->
</div>
</div>

View File

@@ -0,0 +1,30 @@
<h4 class="dialog-title">Crop<br/><br/>(Not yet implemented)</h4>
<div id="crop">
<div class="dialog-section">
<div class="form-group">
<label class="label label-range">Size</label>
<div class="range-wrapper">
<output for="crop" value="50">50</output>
<input type="range" name="crop" min="0" max="100" value="50">
</div>
</div>
</div>
<div id="fit" class="dialog-section">
<div class="form-group">
<label class="label label-sm">Proportions</label>
<div class="btn-group center">
<button class="btn btn-transparent btn-icon">
<span class="icon number">Fit</span>
</button>
<button class="btn btn-transparent btn-icon">
<span class="icon number">Fill</span>
</button>
<button class="btn btn-transparent btn-icon">
<span class="icon number">1:1</span>
</button>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,15 @@
<h4 class="dialog-title">Embed Space</h4>
<div id="embed">
<div class="dialog-section">
<p>
Copy and paste this HTML code into your blog or website:
</p>
</div>
<hr>
<div class="dialog-section">
<div class="form-group">
<textarea class="input input-md no-b input-block no-p" style="line-height: 140% !important; height: 200px; font-size: 13px !important; color: #666; font-family: courier" v-model="space_embed_html"></textarea>
</div>
</div>
</div>

View File

@@ -0,0 +1,73 @@
<h4 class="dialog-title">Filters</h4>
<div id="filter">
<div class="dialog-section">
<span class="icon icon-lightbulb"></span>
<div class="form-group">
<label class="label label-range">Brightness</label>
<div class="range-wrapper">
<output for="brightness">{{active_style.brightness}}</output>
<input type="range" name="brightness" min="0" max="200" value="100" v-model="active_style.brightness">
</div>
</div>
</div>
<div class="dialog-section">
<span class="icon icon-contrast"></span>
<div class="form-group">
<label class="label label-range">Contrast</label>
<div class="range-wrapper">
<output for="contrast">{{active_style.contrast}}</output>
<input type="range" name="contrast" min="0" max="200" value="100" v-model="active_style.contrast">
</div>
</div>
</div>
<div class="dialog-section">
<span class="icon icon-certificate"></span>
<div class="form-group">
<label class="label label-range">Saturation</label>
<div class="range-wrapper">
<output for="saturation">{{active_style.saturation}}</output>
<input type="range" name="saturation" min="0" max="200" value="100" v-model="active_style.saturation">
</div>
</div>
</div>
<div class="dialog-section">
<span class="icon icon-circle-subtract"></span>
<div class="form-group">
<label class="label label-range">Opacity</label>
<div class="range-wrapper">
<output for="opacity">{{active_style.opacity}}</output>
<input type="range" name="opacity" min="0" max="100" value="100" v-model="active_style.opacity">
</div>
</div>
</div>
<div class="dialog-section">
<span class="icon icon-leave"></span>
<div class="form-group">
<label class="label label-range">Hue</label>
<div class="range-wrapper">
<output for="hue">{{active_style.hue}}</output>
<input type="range" name="hue" min="0" max="360" value="0" v-model="active_style.hue">
</div>
</div>
</div>
<div class="dialog-section">
<span class="icon icon-tint"></span>
<div class="form-group">
<label class="label label-range">Blur</label>
<div class="range-wrapper">
<output for="blur">{{active_style.blur}}</output>
<input type="range" name="blur" min="0" max="100" value="0" v-model="active_style.blur">
</div>
</div>
</div>
</div>
<div class="dialog-section no-p">
<button class="btn btn-transparent btn-block text-center" v-on:click="reset_artifact_filters()">Reset</button>
</div>

View File

@@ -0,0 +1,29 @@
<div id="grid">
<div class="dialog-section no-p-b no-p-h">
<div class="form-group no-m">
<label class="label label-sm">Grid</label>
<input class="input no-b no-p text-center" spellcheck="false" type="text" pattern="[0-9]" maxlength="64" ng-model="grid.spacing" value="50">
<button tabindex="-1" class="input-drag btn btn-transparent btn-icon" sd-fader="y-encoder" sd-fader-var-y="grid.spacing" sd-fader-min-y="4" sd-fader-max-y="500" sd-fader-step="1">
<span class="icon icon-triangles-vertical"></span>
</button>
<span class="input-unit">px</span>
</div>
</div>
<div class="dialog-section no-p-b no-p-h">
<div class="form-group no-m">
<label class="label label-sm">Subdivision</label>
<input class="input no-b no-p text-center" spellcheck="false" type="text" pattern="[0-9]" maxlength="64" ng-model="grid.subdivisions" value="4">
<button class="btn-more btn btn-icon btn-transparent" ng-click="increase_grid_subdivisions()"> </button>
<button class="btn-less btn btn-icon btn-transparent" ng-click="decrease_grid_subdivisions()"> </button>
</div>
</div>
<div class="dialog-section">
<button class="btn btn-md btn-block btn-darker" ng-click="open_dialog('canvas')">
Close
</button>
</div>
</div>

View File

@@ -0,0 +1,15 @@
<h4 class="dialog-title">Image</h4>
<div id="image">
<div class="dialog-section">
<label class="btn btn-xxl btn-transparent btn-icon">
<span class="icon icon-picture-upload"></span>
<input type="file" accept="*/*" multiple v-on:change="handle_image_file_upload($event)" id="image_file_upload">
</label>
<p>Click to Upload<br/> or drag file(s) anywhere.</p>
</div>
<div class="dialog-section no-p-b">
<input type="text" v-model="image_search_query" class="input input-md input-white input-round text-center no-p no-b no-r input-block" placeholder="Search / Paste URL" v-on:keyup.enter="search_images(image_search_query)">
</div>
<button class="btn btn-transparent btn-block text-center" v-on:click="handle_insert_image_url(image_search_query)">Insert Image</button>
</div>

View File

@@ -0,0 +1,65 @@
<div id="layout" class="relative">
<div class="dialog-section no-p-b">
<div class="btn-group">
<button class="btn btn-transparent btn-icon" v-on:click="layout_stack_top()">
<span class="icon icon-stack-3d-top"></span>
</button>
<button class="btn btn-transparent btn-icon" v-on:click="layout_stack_bottom()">
<span class="icon icon-stack-3d-bottom"></span>
</button>
<button class="left btn btn-transparent btn-icon" v-on:click="layout_align_left()">
<span class="icon icon-align-left"></span>
</button>
<button class="right btn btn-transparent btn-icon" v-on:click="layout_align_right()">
<span class="icon icon-align-right"></span>
</button>
<button class="top btn btn-transparent btn-icon" v-on:click="layout_align_top()">
<span class="icon icon-align-top"></span>
</button>
<button class="bottom btn btn-transparent btn-icon" v-on:click="layout_align_bottom()">
<span class="icon icon-align-bottom"></span>
</button>
</div>
<div class="btn-group">
<button class="btn btn-transparent btn-icon" v-on:click="layout_align_center()">
<span class="icon icon-align-center-horizontal"></span>
</button>
<button class="btn btn-transparent btn-icon" v-on:click="layout_align_middle()">
<span class="icon icon-align-center-vertical"></span>
</button>
<button class="btn btn-transparent btn-icon" v-on:click="layout_distribute_horizontal()">
<span class="icon icon-distribute-horizontal"></span>
</button>
<button class="btn btn-transparent btn-icon" v-on:click="layout_distribute_vertical()">
<span class="icon icon-distribute-vertical"></span>
</button>
<button class="btn btn-transparent btn-icon" v-on:click="layout_distribute_horizontal_spacing()">
<span class="icon icon-spacing-horizontal"></span>
</button>
<button class="btn btn-transparent btn-icon" v-on:click="layout_distribute_vertical_spacing()">
<span class="icon icon-spacing-vertical"></span>
</button>
<button class="btn btn-transparent btn-icon" v-on:click="layout_auto()">
<span class="icon icon-cluster"></span>
</button>
</div>
<!--div class="dialog-section no-p-b no-p-h" v-if="selection_metrics.count>1">
<label class="label label-sm">Match Size</label>
<div class="btn-group">
<button class="btn btn-transparent btn-icon" v-on:click="layout_match_size_vert()">
<span class="icon icon-size-vertical"></span>
</button>
<button class="btn btn-transparent btn-icon" v-on:click="layout_match_size_both()">
<span class="icon icon-size-both"></span>
</button>
<button class="btn btn-transparent btn-icon" v-on:click="layout_match_size_horiz()">
<span class="icon icon-size-horizontal"></span>
</button>
</div>
</div-->
</div>
</div>

View File

@@ -0,0 +1,13 @@
<div class="dialog-section no-p">
<div class="form-group">
<div class="input-group">
<input class="input no-b w-3 b-r m-r-60" type="url" placeholder="Url"
v-on="keydown:create_link_on_selected_artifacts | key enter"
v-model="insert_link_url">
</div>
<button class="btn btn-transparent btn-icon absolute-bottom-right" v-show="selection_metrics.has_link" v-on="click:remove_link_from_selected_artifacts()">
<span class="icon icon-link-open"></span>
</button>
</div>
</div>

View File

@@ -0,0 +1,88 @@
<h4 class="dialog-title">Metrics</h4>
<div id="metrics">
<!-- <button class="btn btn-toggle btn-transparent btn-icon" ng-class="{alt:artifact_aspect_ratio=='locked'}">
<span class="btn-option" ng-click="set_artifact_aspect_ratio($event,'locked')" >
<span class="icon icon-lock-open"></span>
</span>
<span class="btn-option" ng-click="set_artifact_aspect_ratio($event,'open')" >
<span class="icon icon-lock-closed"></span>
</span>
</button>
<button class="btn btn-transparent btn-icon">
<span class="icon number">1:1</span>
</button> -->
<div class="dialog-section no-p-b no-p-h">
<div class="input-couple">
<div>
<div class="form-group no-m">
<label class="label label-sm text-right">Width</label>
<input class="input no-b no-p text-right" spellcheck="false" type="text" value="0" pattern="[0-9]" maxlength="6" ng-model="selection_metrics.w">
<button tabindex="-1" class="input-drag btn btn-transparent btn-icon" sd-fader="y-encoder" sd-fader-var-y="selection_metrics.w" sd-fader-min-y="0" sd-fader-max-y="100000" sd-fader-step="0.1">
<span class="icon icon-triangles-vertical"></span>
</button>
<!-- <span class="input-unit">px</span> -->
<span class="times"> × </span>
</div>
</div>
<div>
<div class="form-group no-m">
<label class="label label-sm text-left">Height</label>
<input class="input no-b no-p text-left" spellcheck="false" type="text" value="0" pattern="[0-9]" maxlength="6" ng-model="selection_metrics.h">
<button class="input-drag btn btn-transparent btn-icon absolute-bottom-right" sd-fader="y-encoder" sd-fader-var-y="selection_metrics.h" sd-fader-min-y="0" sd-fader-max-y="100000" sd-fader-step="0.1">
<span class="icon icon-triangles-vertical"></span>
</button>
<!-- <span class="input-unit">px</span> -->
</div>
</div>
</div>
</div>
<div class="dialog-section no-p-b no-p-h">
<div class="input-couple">
<div>
<div class="form-group no-m">
<label class="label label-sm text-right">X Axis</label>
<input class="input no-b no-p text-right" spellcheck="false" type="text" value="0" pattern="[0-9]" maxlength="6" ng-model="selection_metrics.x1">
<button tabindex="-1" class="input-drag btn btn-transparent btn-icon" sd-fader="y-encoder" sd-fader-var-y="selection_metrics.x1" sd-fader-min-y="0" sd-fader-max-y="100000" sd-fader-step="0.1">
<span class="icon icon-triangles-vertical"></span>
</button>
<!-- <span class="input-unit">px</span> -->
</div>
</div>
<div>
<div class="form-group no-m">
<label class="label label-sm text-left">Y Axis</label>
<input class="input no-b no-p text-left" spellcheck="false" type="text" value="0" pattern="[0-9]" maxlength="6" ng-model="selection_metrics.y1">
<button class="input-drag btn btn-transparent btn-icon absolute-bottom-right" sd-fader="y-encoder" sd-fader-var-y="selection_metrics.y1" sd-fader-min-y="0" sd-fader-max-y="100000" sd-fader-step="0.1">
<span class="icon icon-triangles-vertical"></span>
</button>
<!-- <span class="input-unit">px</span> -->
</div>
</div>
</div>
</div>
<!--div id="transform-origin" class="dialog-section">
<label class="label">Transform Origin</label>
<div class="transform-origin-icon">
<label ng-class="{checked:transform_origin=='absolute-top-left'}" ng-click="set_transform_origin($event,'absolute-top-left')" class="radio only absolute-top-left"> <input type="radio" value="absolute-top-left"> </label>
<label ng-class="{checked:transform_origin=='top-center'}" ng-click="set_transform_origin($event,'top-center')" class="radio only top-center"> <input type="radio" value="top-center"> </label>
<label ng-class="{checked:transform_origin=='absolute-top-right'}" ng-click="set_transform_origin($event,'absolute-top-right')" class="radio only absolute-top-right"> <input type="radio" value="absolute-top-right"> </label>
<label ng-class="{checked:transform_origin=='center-left'}" ng-click="set_transform_origin($event,'center-left')" class="radio only center-left"> <input type="radio" value="center-left"> </label>
<label ng-class="{checked:transform_origin=='center-center'}" ng-click="set_transform_origin($event,'center-center')" class="radio only center-center"> <input type="radio" value="center-center"> </label>
<label ng-class="{checked:transform_origin=='center-right'}" ng-click="set_transform_origin($event,'center-right')" class="radio only center-right"> <input type="radio" value="center-right"> </label>
<label ng-class="{checked:transform_origin=='absolute-bottom-left'}" ng-click="set_transform_origin($event,'absolute-bottom-left')" class="radio only absolute-bottom-left"> <input type="radio" value="absolute-bottom-left"> </label>
<label ng-class="{checked:transform_origin=='bottom-center'}" ng-click="set_transform_origin($event,'bottom-center')" class="radio only bottom-center"> <input type="radio" value="bottom-center"> </label>
<label ng-class="{checked:transform_origin=='absolute-bottom-right'}" ng-click="set_transform_origin($event,'absolute-bottom-right')" class="radio only absolute-bottom-right"> <input type="radio" value="absolute-bottom-right"> </label>
</div>
</div-->
</div>

View File

@@ -0,0 +1,37 @@
<div class="dialog-section no-b no-p" v-if="active_space_loaded">
<div class="btn-group">
<button class="btn btn-transparent btn-icon-labeled" v-on:click="delete_selected_artifacts()">
<span class="icon icon-trash"></span>
<span class="icon-label">[[__("delete")]]</span>
</button>
<button class="btn btn-divider"></button>
<button class="btn btn-transparent btn-icon-labeled" v-on:click="toggle_lock_of_selected_artifacts()" v-if="active_space_role=='admin'">
<span class="icon icon-lock-closed"></span>
<span class="icon-label">[[__("lock")]]</span>
</button>
<button class="btn btn-transparent btn-icon-labeled" v-on:click="toggle_lock_of_selected_artifacts()" v-if="active_space_role=='admin'">
<span class="icon icon-lock-open"></span>
<span class="icon-label">[[__("unlock")]]</span>
</button>
<button class="btn btn-transparent btn-icon-labeled" v-on:click="duplicate_selected_artifacts()">
<span class="icon icon-duplicate"></span>
<span class="icon-label">[[__("copy")]]</span>
</button>
<button class="btn btn-transparent btn-icon-labeled" v-on:click="create_link_on_selected_artifacts()">
<span class="icon icon-link"></span>
<span class="icon-label">[[__("link")]]</span>
</button>
<span v-if="first_selected_artifact">
<button class="btn btn-transparent btn-icon-labeled" v-on:click="download_selected_artifacts()" v-if="selection_metrics.count==1 && first_selected_artifact.payload_uri">
<span class="icon icon-download"></span>
<span class="icon-label">[[__("download")]]</span>
</button>
</span>
</div>
</div>

View File

@@ -0,0 +1,24 @@
<div id="sections">
<h4 class="dialog-title">Selection</h4>
<div class="dialog-section no-p no-b">
<button class="btn btn-transparent btn-block " v-on="click: add_section('grid',-1)">
<span style="margin: 7px" class="icon absolute-left icon-md icon-grid-free"></span>
<span class="icon-label">Grid</span>
</button>
</div>
<div class="dialog-section no-p">
<button class="btn btn-transparent btn-block " v-on="click: add_section('board',-1)">
<span style="margin: 7px" class="icon absolute-left icon-md icon-cluster"></span>
<span class="icon-label">Canvas</span>
</button>
</div>
<div class="dialog-section no-p">
<button class="btn btn-transparent btn-block " v-on="click: add_section('article',-1)">
<span style="margin: 7px" class="icon absolute-left icon-md icon-text-align-left"></span>
<span class="icon-label">Article</span>
</button>
</div>
</div>

View File

@@ -0,0 +1,48 @@
<h4 class="dialog-title">Pattern</h4>
<div id="pattern">
<div class="dialog-section">
<label class="file btn btn-md btn-block btn-transparent" style="margin-bottom:2px">
<input type="file" >
Upload Image
</label>
<div class="dropdown dropdown-block" drop-down>
<button type="button" class="btn btn-transparent btn-md btn-block btn-dropdown" data-toggle="dropdown">Repeat X-Axis</button>
<div class="dropdown-menu center" role="menu">
<ul class="select-list medium">
<li><span>Repeat X-Axis</span></li>
<li><span>Repeat Y-Axis</span></li>
<li><span>Repeat Both-Axis</span></li>
<li><span>Don't Repeat</span></li>
</ul>
</div>
</div>
</div>
<div id="background-position" class="dialog-section">
<label class="label">Pattern Position</label>
<div class="position-icon">
<label ng-class="{checked:pattern_position=='absolute-top-left'}" ng-click="set_pattern_position($event,'absolute-top-left')" class="radio only absolute-top-left"> <input type="radio" value="absolute-top-left"> </label>
<label ng-class="{checked:pattern_position=='top-center'}" ng-click="set_pattern_position($event,'top-center')" class="radio only top-center"> <input type="radio" value="top-center"> </label>
<label ng-class="{checked:pattern_position=='absolute-top-right'}" ng-click="set_pattern_position($event,'absolute-top-right')" class="radio only absolute-top-right"> <input type="radio" value="absolute-top-right"> </label>
<label ng-class="{checked:pattern_position=='center-left'}" ng-click="set_pattern_position($event,'center-left')" class="radio only center-left"> <input type="radio" value="center-left"> </label>
<label ng-class="{checked:pattern_position=='center-center'}" ng-click="set_pattern_position($event,'center-center')" class="radio only center-center"> <input type="radio" value="center-center"> </label>
<label ng-class="{checked:pattern_position=='center-right'}" ng-click="set_pattern_position($event,'center-right')" class="radio only center-right"> <input type="radio" value="center-right"> </label>
<label ng-class="{checked:pattern_position=='absolute-bottom-left'}" ng-click="set_pattern_position($event,'absolute-bottom-left')" class="radio only absolute-bottom-left"> <input type="radio" value="absolute-bottom-left"> </label>
<label ng-class="{checked:pattern_position=='bottom-center'}" ng-click="set_pattern_position($event,'bottom-center')" class="radio only bottom-center"> <input type="radio" value="bottom-center"> </label>
<label ng-class="{checked:pattern_position=='absolute-bottom-right'}" ng-click="set_pattern_position($event,'absolute-bottom-right')" class="radio only absolute-bottom-right"> <input type="radio" value="absolute-bottom-right"> </label>
</div>
</div>
<div class="dialog-section p-20">
<div class="form-group">
<label class="label label-range">Size</label>
<div class="range-wrapper">
<output for="crop" value="50">50</output>
<input type="range" name="crop" min="0" max="100" value="50">
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,12 @@
<div id="pick-mobile" v-if="active_space" class="dialog-section" v-show="opened_dialog=='mobile'">
<h4 class="dialog-title">Mobile Upload</h4>
<img v-if="active_space.edit_hash" v-bind:src="'/api/helper/qrcode/'+ active_space._id" />
<p class="text-center">
Install the Spacedeck App on your phone and scan this QR code to upload photos, sound, video or text.
<p>
<p class="text-center">
Access Code: {{active_space.edit_hash}}
</p>
</div>

View File

@@ -0,0 +1,70 @@
<div id="search" class="relative w-8" style="height:350px">
<ul class="dialog-side-tabs">
<li>
<button class="btn btn-xl btn-transparent btn-icon-labeled hover" v-class="active:media_search_target=='google'" v-on="click:search_google(generic_search_query)">
<span class="icon icon-social-google"></span>
<span class="icon-label">Google</span>
</button>
</li>
<li>
<button class="btn btn-xl btn-transparent btn-icon-labeled hover" v-class="active:media_search_target=='youtube'" v-on="click:search_youtube(generic_search_query)">
<span class="icon icon-social-youtube"></span>
<span class="icon-label">Youtube</span>
</button>
</li>
<li>
<button class="btn btn-xl btn-transparent btn-icon-labeled hover" v-class="active:media_search_target=='tumblr'" v-on="click:search_tumblr(generic_search_query)">
<span class="icon icon-social-tumblr"></span>
<span class="icon-label">Tumblr</span>
</button>
</li>
<li>
<button class="btn btn-xl btn-transparent btn-icon-labeled hover" v-class="active:media_search_target=='soundcloud'" v-on="click:search_soundcloud(generic_search_query)">
<span class="icon icon-social-soundcloud"></span>
<span class="icon-label">Soundcloud</span>
</button>
</li>
</ul>
<div class="dialog-search-input">
<!-- generic search box placeholder -->
<div class="relative">
<span class="icon icon-zoom absolute-top-left no-events" style="margin-top: -2px;"></span>
<input type="text" v-model="generic_search_query" v-focus class="input input-white input-round input-block no-b p-l-60" placeholder="[[__("search_media_placeholder")]]" v-on="keyup: search_generic(generic_search_query) | key enter">
</div>
<!-- <button type="button" class="btn btn-sm btn-icon btn-round btn-darken absolute-top-right clear-search" style="margin-right: 42px; margin-top: 40px;">
<span class="icon icon-cross-1"></span>
</button> -->
</div>
<div class="overflow-y-scroll fit dialog-search-results dialog-section" v-if="search_loading">
<span class="middle">Searching...</span>
</div>
<!-- search results audio -->
<div class="overflow-y-scroll fit dialog-search-results dialog-section" v-if="audio_search_results.length">
<div class="search-result search-result-audio relative" v-repeat="r : audio_search_results" v-on="click:create_artifact_via_embed_url(r.permalink_url)">
<iframe frameborder="0" seamless width="100%" v-attr="src:r.embed_url"></iframe>
</div>
</div>
<!-- search results images -->
<div class="overflow-y-scroll fit dialog-search-results dialog-section" v-if="image_search_results.length">
<div class="search-result search-result-image" v-repeat="r : image_search_results" v-on="click:handle_insert_image_url(r.link)">
<img v-attr="src:r.thumb"/>
</div>
</div>
<!-- search results video -->
<div class="overflow-y-scroll fit dialog-search-results dialog-section" v-if="video_search_results.length">
<div class="search-result search-result-video relative" v-repeat="r : video_search_results" v-on="click:create_artifact_via_embed_url('https://youtube.com/?v='+r.id.videoId)">
<div class="thumbnail" v-style="background-image: 'url(https://img.youtube.com/vi/'+r.id.videoId+'/hqdefault.jpg)'"> </div>
<span>{{r.snippet.title}}</span>
<!-- <span>{{r.snippet.description}}</span> -->
<!-- <span>{{r.snippet.thumbnails.medium.url}}</span> -->
</div>
</div>
</div>

View File

@@ -0,0 +1,31 @@
<div id="sections">
<h4 class="dialog-title">Selection</h4>
<div class="dialog-section no-p no-b">
<button class="btn btn-transparent btn-block" v-on:click="toggle_selected_artifact_editing()" v-bind:class="active:editing_artifact_id">
<span style="margin: 7px" class="icon absolute-left icon-md icon-pencil"></span>
<span class="icon-label">Edit</span>
</button>
</div>
<div class="dialog-section no-p">
<button class="btn btn-transparent btn-block">
<span style="margin: 7px" class="icon absolute-left icon-md icon-group"></span>
<span class="icon-label">Group</span>
</button>
</div>
<div class="dialog-section no-p">
<button class="btn btn-transparent btn-block" >
<span style="margin: 7px" class="icon absolute-left icon-md icon-duplicate"></span>
<span class="icon-label">Copy</span>
</button>
</div>
<div class="dialog-section no-p">
<button class="btn btn-transparent btn-block" v-on:click="delete_selected_artifacts()">
<span style="margin: 7px" class="icon absolute-left icon-md icon-trash"></span>
<span class="icon-label">Delete</span>
</button>
</div>
</div>

View File

@@ -0,0 +1,69 @@
<h4 class="dialog-title">[[__("tool_shape")]]</h4>
<div id="shapes">
<div class="dialog-section no-p-h" style="white-space: normal;">
<button class="btn btn-icon-labeled btn-transparent" v-on:click="add_shape('ellipse',$event)">
<span class="icon icon-shape-circle"></span>
<span class="icon-label">[[__("tool_circle")]]</span>
</button>
<button class="btn btn-icon-labeled btn-transparent" v-on:click="add_shape('hexagon',$event)">
<span class="icon icon-shape-hexagon"></span>
<span class="icon-label">[[__("tool_hexagon")]]</span>
</button>
<button class="btn btn-icon-labeled btn-transparent" v-on:click="add_shape('square',$event)">
<span class="icon icon-shape-square"></span>
<span class="icon-label">[[__("tool_square")]]</span>
</button>
<!--button class="btn btn-icon-labeled btn-transparent rot45" v-on:click="add_shape('diamond',$event)">
<span class="icon icon-shape-square"></span>
<span class="icon-label">[[__("tool_diamond")]]</span>
</button-->
<button class="btn btn-icon-labeled btn-transparent" v-on:click="add_shape('speechbubble',$event)">
<span class="icon icon-shape-bubble"></span>
<span class="icon-label">[[__("tool_bubble")]]</span>
</button>
<button class="btn btn-icon-labeled btn-transparent" v-on:click="add_shape('cloud',$event)">
<span class="icon icon-shape-cloud"></span>
<span class="icon-label">[[__("tool_cloud")]]</span>
</button>
<button class="btn btn-icon-labeled btn-transparent" v-on:click="add_shape('burst',$event)">
<span class="icon icon-shape-burst"></span>
<span class="icon-label">[[__("tool_burst")]]</span>
</button>
<button class="btn btn-icon-labeled btn-transparent" v-on:click="add_shape('star',$event)">
<span class="icon icon-shape-star"></span>
<span class="icon-label">[[__("tool_star")]]</span>
</button>
<button class="btn btn-icon-labeled btn-transparent" v-on:click="add_shape('heart',$event)">
<span class="icon icon-shape-heart"></span>
<span class="icon-label">[[__("tool_heart")]]</span>
</button>
<button class="btn btn-icon-labeled btn-transparent" v-on:click="start_drawing_arrow()">
<span class="icon icon-tool-arrow"></span>
<span class="icon-label">[[__("tool_arrow")]]</span>
</button>
<button class="btn btn-icon-labeled btn-transparent" v-on:click="start_drawing_line()">
<span class="icon icon-tool-line"></span>
<span class="icon-label">[[__("tool_line")]]</span>
</button>
</div>
</div>
<!--
<div class="dialog-section no-p">
<div class="btn-cluster">
<button class="btn btn-transparent text-center"> Upload </button>
<button class="btn btn-transparent text-center" v-on:click="start_drawing_scribble()"> Draw </button>
</div>
</div>
-->

View File

@@ -0,0 +1,19 @@
<!-- <h4 class="dialog-title">Share</h4> -->
<div class="dialog-section no-p">
<a class="btn btn-transparent btn-icon-labeled hover" href="http://www.facebook.com/sharer.php?u={{share_base_url_enc}}{{active_space._id}}">
<span class="icon icon-social-square-facebook"> </span>
<span class="icon-label"> facebook </span>
</a>
<a class="btn btn-transparent btn-icon-labeled hover" target="_blank" href="https://twitter.com/intent/tweet?url={{share_base_url_enc}}{{active_space._id}}">
<span class="icon icon-social-twitter"> </span>
<span class="icon-label"> twitter </span>
</a>
<a class="btn btn-transparent btn-icon-labeled hover email" target="_blank" href="mailto:?subject=Check out my new Space&amp;body={{share_base_url_enc}}{{active_space._id}}">
<span class="icon icon-mail"> </span>
<span class="icon-label"> email </span>
</a>
<hr>
<h4 class="dialog-title">Share via Link</h4>
<span class="input no-b" style="height:auto;padding:15px">{{share_base_url+active_space._id}}</span>
</div>

View File

@@ -0,0 +1,110 @@
<h4 class="dialog-title">Size</h4>
<div>
<div class="dialog-section no-p-b no-p-h">
<div class="btn-group">
<button class="btn btn-transparent btn-icon">
<span class="icon icon-size-vertical"></span>
</button>
<button class="btn btn-transparent btn-icon">
<span class="icon icon-size-both"></span>
</button>
<button class="btn btn-transparent btn-icon">
<span class="icon icon-size-horizontal"></span>
</button>
</div>
</div>
<div class="dialog-section no-p">
<!-- <button class="btn btn-toggle btn-transparent btn-icon" ng-class="{alt:artifact_aspect_ratio=='locked'}">
<span class="btn-option" ng-click="set_artifact_aspect_ratio($event,'locked')" >
<span class="icon icon-lock-open"></span>
</span>
<span class="btn-option" ng-click="set_artifact_aspect_ratio($event,'open')" >
<span class="icon icon-lock-closed"></span>
</span>
</button> -->
<button class="btn btn-transparent btn-icon">
<span class="icon number">1:1</span>
</button>
<button class="btn btn-transparent btn-icon">
<span class="icon number">Auto</span>
</button>
</div>
<div class="dialog-section no-p-b no-p-h">
<div class="input-couple">
<div>
<div class="form-group no-m">
<label class="label label-sm text-right">Width</label>
<input class="input no-b no-p text-right" spellcheck="false" type="text" value="0" pattern="[0-9]" maxlength="6" ng-model="selection_metrics.w">
<button tabindex="-1" class="input-drag btn btn-transparent btn-icon" sd-fader="y-encoder" sd-fader-var-y="selection_metrics.w" sd-fader-min-y="0" sd-fader-max-y="100000" sd-fader-step="0.1">
<span class="icon icon-triangles-vertical"></span>
</button>
<!-- <span class="input-unit">px</span> -->
<span class="times"> × </span>
</div>
</div>
<div>
<div class="form-group no-m">
<label class="label label-sm text-left">Height</label>
<input class="input no-b no-p text-left" spellcheck="false" type="text" value="0" pattern="[0-9]" maxlength="6" ng-model="selection_metrics.h">
<button class="input-drag btn btn-transparent btn-icon absolute-bottom-right" sd-fader="y-encoder" sd-fader-var-y="selection_metrics.h" sd-fader-min-y="0" sd-fader-max-y="100000" sd-fader-step="0.1">
<span class="icon icon-triangles-vertical"></span>
</button>
<!-- <span class="input-unit">px</span> -->
</div>
</div>
</div>
</div>
<div class="dialog-section no-p-b no-p-h hidden">
<div class="input-couple">
<div>
<div class="form-group no-m">
<label class="label label-sm text-right">X Axis</label>
<input class="input no-b no-p text-right" spellcheck="false" type="text" value="0" pattern="[0-9]" maxlength="6" ng-model="selection_metrics.x1">
<button tabindex="-1" class="input-drag btn btn-transparent btn-icon" sd-fader="y-encoder" sd-fader-var-y="selection_metrics.x1" sd-fader-min-y="0" sd-fader-max-y="100000" sd-fader-step="0.1">
<span class="icon icon-triangles-vertical"></span>
</button>
<!-- <span class="input-unit">px</span> -->
</div>
</div>
<div>
<div class="form-group no-m">
<label class="label label-sm text-left">Y Axis</label>
<input class="input no-b no-p text-left" spellcheck="false" type="text" value="0" pattern="[0-9]" maxlength="6" ng-model="selection_metrics.y1">
<button class="input-drag btn btn-transparent btn-icon absolute-bottom-right" sd-fader="y-encoder" sd-fader-var-y="selection_metrics.y1" sd-fader-min-y="0" sd-fader-max-y="100000" sd-fader-step="0.1">
<span class="icon icon-triangles-vertical"></span>
</button>
<!-- <span class="input-unit">px</span> -->
</div>
</div>
</div>
</div>
<!--div id="transform-origin" class="dialog-section">
<label class="label">Transform Origin</label>
<div class="transform-origin-icon">
<label ng-class="{checked:transform_origin=='absolute-top-left'}" ng-click="set_transform_origin($event,'absolute-top-left')" class="radio only absolute-top-left"> <input type="radio" value="absolute-top-left"> </label>
<label ng-class="{checked:transform_origin=='top-center'}" ng-click="set_transform_origin($event,'top-center')" class="radio only top-center"> <input type="radio" value="top-center"> </label>
<label ng-class="{checked:transform_origin=='absolute-top-right'}" ng-click="set_transform_origin($event,'absolute-top-right')" class="radio only absolute-top-right"> <input type="radio" value="absolute-top-right"> </label>
<label ng-class="{checked:transform_origin=='center-left'}" ng-click="set_transform_origin($event,'center-left')" class="radio only center-left"> <input type="radio" value="center-left"> </label>
<label ng-class="{checked:transform_origin=='center-center'}" ng-click="set_transform_origin($event,'center-center')" class="radio only center-center"> <input type="radio" value="center-center"> </label>
<label ng-class="{checked:transform_origin=='center-right'}" ng-click="set_transform_origin($event,'center-right')" class="radio only center-right"> <input type="radio" value="center-right"> </label>
<label ng-class="{checked:transform_origin=='absolute-bottom-left'}" ng-click="set_transform_origin($event,'absolute-bottom-left')" class="radio only absolute-bottom-left"> <input type="radio" value="absolute-bottom-left"> </label>
<label ng-class="{checked:transform_origin=='bottom-center'}" ng-click="set_transform_origin($event,'bottom-center')" class="radio only bottom-center"> <input type="radio" value="bottom-center"> </label>
<label ng-class="{checked:transform_origin=='absolute-bottom-right'}" ng-click="set_transform_origin($event,'absolute-bottom-right')" class="radio only absolute-bottom-right"> <input type="radio" value="absolute-bottom-right"> </label>
</div>
</div-->
</div>

View File

@@ -0,0 +1,68 @@
<h4 class="dialog-title">Stroke</h4>
<div id="stroke">
<div class="dialog-section no-p">
<div class="form-group no-m">
<input class="input no-b no-p text-center text-large" spellcheck="false" type="number" v-model="active_style.stroke">
<button tabindex="-1" class="input-drag btn btn-transparent btn-icon" v-sd-fader="true" sd-fader-var-y="active_style.stroke" sd-fader-min-y="0" sd-fader-max-y="100" sd-fader-step="1">
<span class="icon icon-triangles-vertical"></span>
</button>
<span class="input-unit">px</span>
</div>
</div>
<div class="dialog-section no-p-h no-p-b" v-show="selection_metrics.borders_stylable">
<div class="form-group no-m">
<label class="label label-sm">Border Radius</label>
<input class="input no-b no-p text-center" spellcheck="false" type="number" v-model="active_style.border_radius">
<button tabindex="-1" class="input-drag btn btn-transparent btn-icon" v-sd-fader="true" sd-fader-var-y="active_style.border_radius" sd-fader-min-y="0" sd-fader-max-y="500" sd-fader-step="1">
<span class="icon icon-triangles-vertical"></span>
</button>
<span class="input-unit">px</span>
</div>
</div>
<div id="style" class="dialog-section no-p-h no-p-b" v-show="selection_metrics.borders_stylable">
<div class="form-group">
<label class="label label-sm">Border Style</label>
<div class="btn-group center">
<button class="btn btn-transparent btn-icon" v-on="click:set_artifact_style_prop('stroke_style','solid')">
<span class="icon icon-border-solid"></span>
</button>
<button class="btn btn-transparent btn-icon" v-on="click:set_artifact_style_prop('stroke_style','dashed')">
<span class="icon icon-border-dashed"></span>
</button>
<button class="btn btn-transparent btn-icon" v-on="click:set_artifact_style_prop('stroke_style','dotted')">
<span class="icon icon-border-dotted"></span>
</button>
</div>
</div>
</div>
<!-- <div class="dialog-section">
<label class="btn btn-sm btn-round color-indicator" style="background-color:{{active_style.stroke_color}}"><input type="color" v-model="active_style.stroke_color" style="display:block;visibility:hidden;position:absolute;"></label>
</div>
-->
<div class="dialog-section no-p">
<button class="btn btn-transparent btn-block text-center" v-on="click:reset_stroke()">Remove Stroke</button>
</div>
</div>
<!--div id="style" class="dialog-section">
<div class="form-group">
<label class="label label-sm">Arrow Head</label>
<div class="btn-group center">
<button class="btn btn-transparent btn-icon">
<span class="icon icon-chevron-up-4"></span>
</button>
<button class="btn btn-transparent btn-icon">
<span class="icon icon-shape-triangle"></span>
</button>
<button class="btn btn-transparent btn-icon">
<span class="icon icon-moon-new"></span>
</button>
</div>
</div>
</div-->

View File

@@ -0,0 +1,28 @@
<div class="dialog-section no-b no-p">
<div class="btn-group">
<button class="btn btn-transparent btn-icon" v-on:click="set_artifact_style_prop('align','left')">
<span class="icon icon-text-align-left-alt"></span>
</button>
<button class="btn btn-transparent btn-icon" v-on:click="set_artifact_style_prop('align','center')">
<span class="icon icon-text-align-center-alt"></span>
</button>
<button class="btn btn-transparent btn-icon" v-on:click="set_artifact_style_prop('align','right')">
<span class="icon icon-text-align-right-alt"></span>
</button>
<button class="btn btn-transparent btn-icon" v-on:click="set_artifact_style_prop('align','justify')">
<span class="icon icon-text-align-justify-alt"></span>
</button>
<button class="btn btn-divider"></button>
<button class="btn btn-transparent btn-icon" v-on:click="set_artifact_style_prop('valign','top')">
<span class="icon icon-align-vertical-top"></span>
</button>
<button class="btn btn-transparent btn-icon" v-on:click="set_artifact_style_prop('valign','middle')">
<span class="icon icon-align-vertical-middle"></span>
</button>
<button class="btn btn-transparent btn-icon" v-on:click="set_artifact_style_prop('valign','bottom')">
<span class="icon icon-align-vertical-bottom"></span>
</button>
</div>
</div>

View File

@@ -0,0 +1,25 @@
<h4 class="dialog-title">Columns</h4>
<div id="type-columns" class="relative">
<div class="dialog-section no-p">
<div class="form-group no-m">
<!-- <label class="label label-sm">Columns</label> -->
<input class="input no-b no-p text-center text-large" spellcheck="false" type="text" pattern="[0-9]" maxlength="10" v-model="active_style.columns">
<button class="btn-more btn btn-icon btn-transparent" v-on="click:increase_columns()"> </button>
<button class="btn-less btn btn-icon btn-transparent" v-on="click:decrease_columns()"> </button>
</div>
</div>
<div class="dialog-section no-p-b no-p-h">
<div class="form-group no-m">
<label class="label label-sm text-center">Gutter</label>
<input class="input no-b no-p text-center" spellcheck="false" type="text" pattern="[0-9\.]" maxlength="3" v-model="active_style.gutter">
<button tabindex="-1" class="input-drag btn btn-transparent btn-icon" style="cursor: ns-resize;" v-sd-fader="true" sd-fader-var-y="active_style.gutter" sd-fader-min-y="0" sd-fader-max-y="200" sd-fader-step="1">
<span class="icon icon-triangles-vertical"></span>
</button>
<span class="input-unit">px</span>
</div>
</div>
</div>

View File

@@ -0,0 +1,13 @@
<div id="typography" class="relative">
<div id="font">
<ul class="select-list overflow-y-scroll" style="max-height:315px;width:240px">
<li v-bind:class="{checked:active_font==font}"
v-for="font in fonts"
v-on:mousedown="apply_font($event,font)"
v-on:touchstart="apply_font($event,font)">
<span v-bind:style="{'font-family': font}">{{font}}</span>
</li>
</ul>
</div>
</div>

View File

@@ -0,0 +1,20 @@
<h4 class="dialog-title">[[__("text_formats")]]</h4>
<ul class="select-list overflow-y-scroll" style="min-width: 200px;">
<li id="note-format-div" v-on="mousedown:apply_formatting($event, 'p')"> <span>[[__("format_p")]]</span> </li>
<li id="note-format-ul" v-on="mousedown:apply_formatting($event, 'insertunorderedlist')"> <span>[[__("format_bullets")]]</span> </li>
<li id="note-format-ol" v-on="mousedown:apply_formatting($event, 'insertorderedlist')"> <span>[[__("format_numbers")]]</span> </li>
<li id="note-format-h1" v-on="mousedown:apply_formatting($event, 'h1')"> <span>[[__("format_h1")]]</span> </li>
<li id="note-format-h2" v-on="mousedown:apply_formatting($event, 'h2')"> <span>[[__("format_h2")]]</span> </li>
<li id="note-format-h3" v-on="mousedown:apply_formatting($event, 'h3')"> <span>[[__("format_h3")]]</span> </li>
</ul>
<!--
<div class="dialog-section no-p noflex">
<button class="btn btn-transparent btn-block text-center"> Create New </button>
<div class="btn-cluster">
<button class="btn btn-transparent text-center"> Save </button>
<button class="btn btn-transparent btn-block text-center"> Delete </button>
</div>
</div>
-->

View File

@@ -0,0 +1,29 @@
<div class="dialog-section no-b no-p">
<div class="btn-group">
<!-- <button class="btn btn-transparent btn-icon" ng-click="apply_formatting('caps')">
<span class="icon icon-text-allcaps"></span>
</button> -->
<button class="btn btn-transparent btn-icon-labeled" v-on:click="apply_formatting($event,'bold')">
<span class="icon icon-text-bold"></span>
<span class="icon-label">Bold</span>
</button>
<button class="btn btn-transparent btn-icon-labeled" v-on:click="apply_formatting($event,'italic')">
<span class="icon icon-text-italic"></span>
<span class="icon-label">Italic</span>
</button>
<button class="btn btn-transparent btn-icon-labeled" v-on:click="apply_formatting($event,'underline')">
<span class="icon icon-text-underline"></span>
<span class="icon-label">Underl.</span>
</button>
<button class="btn btn-transparent btn-icon-labeled" v-on:click="apply_formatting($event,'strikeThrough')">
<span class="icon icon-text-strike"></span>
<span class="icon-label">Strike</span>
</button>
<!--button class="btn btn-transparent btn-icon-labeled" v-on:click="apply_formatting($event,'insertUnorderedList')">
<span class="icon icon-text-list-bullet"></span>
<span class="icon-label">Bullets</span>
</button-->
</div>
</div>

View File

@@ -0,0 +1,101 @@
<h4 class="dialog-title">Textframe</h4>
<div id="text-frame">
<div class="dialog-section no-p-b">
<label class="label label-sm">Vertical Alignment</label>
<div class="btn-group">
<button class="btn btn-transparent btn-icon" v-on="click:set_artifact_style_prop('valign','top')" ng-class="{active:selected_artifact.align=='top'}">
<span class="icon icon-align-vertical-top"></span>
</button>
<button class="btn btn-transparent btn-icon" v-on="click:set_artifact_style_prop('valign','middle')" ng-class="{active:selected_artifact.align=='middle'}">
<span class="icon icon-align-vertical-middle"></span>
</button>
<button class="btn btn-transparent btn-icon" v-on="click:set_artifact_style_prop('valign','bottom')" ng-class="{active:selected_artifact.align=='bottom'}">
<span class="icon icon-align-vertical-bottom"></span>
</button>
</div>
</div>
<div class="dialog-section no-p-b no-p-h">
<div class="form-group no-m">
<label class="label label-sm">Padding</label>
<input class="input no-b no-p text-center" spellcheck="false" type="text" pattern="[0-9]" maxlength="64" value="250" v-model="active_style.padding">
<button tabindex="-1" class="input-drag btn btn-transparent btn-icon" style="cursor: ns-resize;" v-sd-fader="true" sd-fader-var-y="active_style.padding" sd-fader-min-y="0" sd-fader-max-y="500" sd-fader-step="1">
<span class="icon icon-triangles-vertical"></span>
</button>
<span class="input-unit">px</span>
</div>
</div>
<div class="dialog-section">
<label class="btn btn-sm btn-round color-indicator" style="background-color:{{active_style.fill_color}};pointer-events:all"><input type="color" v-model="active_style.fill_color" style="display:block;visibility:hidden;position:absolute;"></label>
</div>
<!--div class="dialog-section no-p-b no-p-h">
<div class="form-group no-m">
<label class="label label-sm">Columns</label>
<input class="input no-b no-p text-center" spellcheck="false" type="text" pattern="[0-9]" maxlength="64" value="5">
<button class="btn-more btn btn-icon btn-transparent"> </button>
<button class="btn-less btn btn-icon btn-transparent"> </button>
</div>
</div-->
<!--div class="dialog-section no-p-b no-p-h">
<div class="form-group no-m">
<label class="label label-sm">Gutter</label>
<input class="input no-b no-p text-center" spellcheck="false" type="text" pattern="[0-9]" maxlength="64" value="50">
<button tabindex="-1" class="input-drag btn btn-transparent btn-icon" style="cursor: ns-resize;">
<span class="icon icon-triangles-vertical"></span>
</button>
<span class="input-unit">px</span>
</div>
</div-->
<!-- <div id="padding" class="dialog-section">
<label class="label label-sm">Padding</label>
<div class="padding-icon">
<button id="padding-link" class="btn btn-md btn-toggle btn-dark btn-icon" ng-class="{alt:!padding_locked}" ng-click="toggle_padding_locked()">
<span class="btn-option">
<span class="icon icon-link-closed"></span>
</span>
<span class="btn-option">
<span class="icon icon-link-open"></span>
</span>
</button>
<div class="left">
<input class="input" spellcheck="false" type="text" v-model="active_style.padding_left" value="0" style="cursor: ew-resize;">
<button class="input-drag btn btn-md btn-transparent btn-icon" sd-fader="y-encoder" sd-fader-var-y="active_style.padding_left" sd-fader-min-y="0" sd-fader-max-y="500" sd-fader-step="0.1">
<span class="icon icon-triangles-vertical"></span>
</button>
</div>
<div class="right">
<input class="input" spellcheck="false" type="text" v-model="active_style.padding_right" value="0" style="cursor: ew-resize;">
<button class="input-drag btn btn-md btn-transparent btn-icon" sd-fader="y-encoder" sd-fader-var-y="active_style.padding_left" sd-fader-min-y="0" sd-fader-max-y="500" sd-fader-step="0.1">
<span class="icon icon-triangles-vertical"></span>
</button>
</div>
<div class="top">
<input class="input" spellcheck="false" type="text" v-model="active_style.padding_top" value="0" style="cursor: ns-resize;">
<button class="input-drag btn btn-md btn-transparent btn-icon" sd-fader="y-encoder" sd-fader-var-y="active_style.padding_top" sd-fader-min-y="0" sd-fader-max-y="500" sd-fader-step="0.1">
<span class="icon icon-triangles-vertical"></span>
</button>
</div>
<div class="bottom">
<input class="input" spellcheck="false" type="text" v-model="active_style.padding_bottom" value="0" style="cursor: ns-resize;">
<button class="input-drag btn btn-md btn-transparent btn-icon" sd-fader="y-encoder" sd-fader-var-y="active_style.padding_bottom" sd-fader-min-y="0" sd-fader-max-y="500" sd-fader-step="0.1">
<span class="icon icon-triangles-vertical"></span>
</button>
</div>
</div>
</div> -->
</div>

View File

@@ -0,0 +1,110 @@
<div class="toolbar toolbar-elements" v-bind:class="{in:toolbar_artifacts_in,out:!toolbar_artifacts_in}" v-show="!is_active_space_role('viewer') && active_space_loaded" v-bind:style="{left:toolbar_artifacts_x,top:toolbar_artifacts_y}">
<div class="btn-group dark">
<!--div id="search-dialog" class="dropdown bottom light center static" v-bind:class="{open:opened_dialog=='search'}">
<div class="btn-collapse in">
<button class="btn btn-transparent btn-icon-labeled" v-bind:class="{open:opened_dialog=='search'}" v-on:click="open_dialog('search')" >
<span class="icon icon-search"></span>
<span class="icon-label">[[__("tool_search")]]</span>
</button>
</div>
<div class="dialog dialog-search">
xinclude "./search.html"
</div>
</div-->
<div class="dropdown bottom light center" v-bind:class="{open:opened_dialog=='shapes'}">
<div class="btn-collapse in">
<button class="btn btn-transparent btn-icon-labeled" v-bind:class="{open:opened_dialog=='shapes'}" v-on:click="open_dialog('shapes')">
<span class="icon icon-shapes"></span>
<span class="icon-label">[[__("tool_shape")]]</span>
</button>
</div>
<div class="dialog">
{% include "./shapes.html" %}
</div>
</div>
<button class="btn btn-icon-labeled btn-transparent" v-on:click="start_drawing_scribble()">
<span class="icon icon-tool-scribble"></span>
<span class="icon-label">[[__("tool_scribble")]]</span>
</button>
<div class="dropdown bottom light center">
<div class="btn-collapse in">
<button class="btn btn-transparent btn-icon-labeled" v-on:click="handle_insert_image_url()" v-on:touchstart="handle_insert_image_url()">
<span class="icon icon-upload"></span>
<span class="icon-label" >[[__("tool_upload")]]</span>
</button>
</div>
</div>
<div class="dropdown bottom light center">
<div class="btn-collapse in">
<button class="btn btn-transparent btn-icon-labeled" v-on:click=" add_artifact(active_space, 'text', null, $event)">
<span class="icon icon-tool-text"></span>
<span class="icon-label">[[__("tool_text")]]</span>
</button>
</div>
</div>
<div class="dropdown bottom light center">
<div class="btn-collapse">
<button class="btn btn-transparent btn-icon-labeled" v-bind:class="{open:opened_dialog=='image'}" v-on:click="open_dialog('image')">
<span class="icon icon-picture"></span>
<span class="icon-label">[[__("image")]]</span>
</button>
</div>
<div class="dialog">
{% include "./image.html" %}
</div>
</div>
<div class="dropdown bottom light center" v-bind:class="{open:opened_dialog=='zones'}">
<div class="btn-collapse in">
<button class="btn btn-transparent btn-icon-labeled" v-bind:class="{open:opened_dialog=='zones'}" v-on:click="open_dialog('zones')">
<span class="icon icon-zone"></span>
<span class="icon-label">[[__("tool_zones")]]</span>
</button>
</div>
<div class="dialog">
{% include "./zones.html" %}
</div>
</div>
<div id="mobile-dialog" class="dropdown bottom light center static" v-bind:class="{open:opened_dialog=='mobile'}">
<div class="btn-collapse in">
<button class="btn btn-transparent btn-icon-labeled" v-bind:class="{open:opened_dialog=='mobile'}" v-on:click="open_dialog('mobile')" >
<span class="icon icon-device-mobile"></span>
<span class="icon-label">[[__("mobile")]]</span>
</button>
</div>
<div class="dialog mobile-search">
{% include "./pick-mobile.html" %}
</div>
</div>
<button class="btn btn-divider" v-show="logged_in"></button>
<div class="dropdown bottom light center" v-show="logged_in" v-bind:class="{open:opened_dialog=='background'}">
<div class="btn-collapse in">
<button class="btn btn-transparent btn-icon-labeled" v-bind:class="{open:opened_dialog=='background'}" v-on:click="open_dialog('background')">
<span class="letter">bg</span>
<span class="icon-label">[[__("tool_canvas")]]</span>
</button>
</div>
<div class="dialog">
{% include "./background.html" %}
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,46 @@
<div class="toolbar toolbar-object-options" v-show="(active_space && (active_view == 'space' && !is_active_space_role('viewer')))" v-bind:class="in:(selection_metrics.count>0)">
<div class="btn-group dark">
<div class="btn-group">
<div class="btn-collapse" v-bind:class="in : opened_dialog == 'delete_artifact'">
<button class="btn btn-green btn-icon-labeled hover" v-on="click : delete_selected_artifacts()">
<span class="icon icon-check"></span>
<span class="icon-label">Okay</span>
</button>
</div>
<div class="btn-collapse" v-bind:class="in : opened_dialog == 'delete_artifact' , last : opened_dialog == 'delete_artifact'">
<button class="btn btn-red btn-icon-labeled hover" v-on="click : open_dialog('delete_artifact')">
<span class="icon icon-cross-3"></span>
<span class="icon-label">Cancel</span>
</button>
</div>
<div class="btn-collapse" v-bind:class="in : opened_dialog != 'delete_artifact' , first : opened_dialog != 'delete_artifact'">
<button class="btn btn-dark btn-icon-labeled hover" v-on="click : open_dialog('delete_artifact')">
<span class="icon icon-trash"></span>
<span class="icon-label">Delete</span>
</button>
</div>
</div>
<div class="btn-collapse" v-bind:class="in:selection_metrics.count<2">
<button class="btn btn-transparent btn-icon-labeled hover" v-if="" v-on:click=" show_artifact_comments($event)" >
<span class="icon icon-messages"></span>
<span class="icon-label">Comment</span>
</button>
</div>
<button class="btn btn-transparent btn-icon-labeled hover" v-on:click="duplicate_selected_artifacts()">
<span class="icon icon-duplicate"></span>
<span class="icon-label">Copy</span>
</button>
</div>
<div class="btn-group dark">
<button class="btn btn-transparent btn-icon-labeled hover" v-on:click="deselect(true)">
<span class="icon icon-cross-1"></span>
<span class="icon-label">Cancel</span>
</button>
</div>
</div>

View File

@@ -0,0 +1,130 @@
<div class="toolbar toolbar-properties" v-cloak v-show="active_space_loaded && !is_active_space_role('viewer')" v-bind:class="{in:toolbar_props_in,out:!toolbar_props_in}" v-bind:style="{left:toolbar_props_x,top:toolbar_props_y}" v-if="active_space_loaded">
<div class="btn-group dark">
<div class="dropdown topleft light"
v-bind:class="{open : opened_dialog.match('color') ,
'option-1':opened_dialog=='color-fill' ,
'option-2':opened_dialog=='color-stroke' ,
'option-3':opened_dialog=='color-text',
'options-3':selection_metrics.contains_text}">
<label
class="dropdown-toggle btn btn-icon btn-transparent no-r-r"
v-on:click="open_dialog('color-fill')"
v-bind:class="{open:opened_dialog=='color-fill'}">
<span class="icon icon-tool-fill icon-sm"></span>
<span class="jewel" v-bind:style="{'background-color':active_style.fill_color}"></span>
</label>
<label
class="dropdown-toggle btn btn-icon btn-transparent no-r"
v-bind:class="{open:opened_dialog=='color-stroke'}"
v-on:click="open_dialog('color-stroke')">
<span class="icon icon-tool-stroke icon-sm"></span>
<span class="jewel jewel-stroke" v-bind:style="{'border-color':active_style.stroke_color}"></span>
</label>
<label
class="dropdown-toggle btn btn-icon btn-transparent no-r-l"
v-on:click="open_dialog('color-text')"
v-bind:class="{open:opened_dialog=='color-text'}">
<span class="icon icon-tool-text icon-sm"></span>
<span class="jewel" v-bind:style="{'border-color':active_style.text_color}">{{active_style.font_size}}</span>
</label>
<div class="dialog">
{% include "./color.html" %}
</div>
</div>
</div>
<div class="btn-group dark">
<!-- <button class="btn btn-transparent btn-icon-labeled">
<span class="icon icon-tool-eyedrop"></span>
<span class="icon-label">Eyedrop</span>
</button>
<button class="btn btn-divider"></button>
-->
<div class="dropdown top light center" v-bind:class="{open:opened_dialog=='text-styles'}">
<div class="btn-collapse in">
<button class="btn btn-transparent btn-icon-labeled" v-on:click="open_dialog('text-styles')" v-bind:class="{open : opened_dialog=='text-styles'}">
<span class="icon icon-text-styles"></span>
<span class="icon-label">styles</span>
</button>
</div>
<div class="dialog">
{% include "./text-styles.html" %}
</div>
</div>
<div class="dropdown top light center" v-bind:class="{open:opened_dialog=='filter'}">
<div class="btn-collapse" v-bind:class="{in:selection_metrics.contains_images}">
<!-- <div class="btn-collapse" v-bind:class="in:selection_metrics.count>0"> -->
<button class="btn btn-transparent btn-icon-labeled" v-on:click="open_dialog('filter')" v-bind:class="{open : opened_dialog=='filter'}">
<span class="icon icon-contrast"></span>
<span class="icon-label">[[__("tool_filter")]]</span>
</button>
</div>
<div class="dialog">
{% include "./filter.html" %}
</div>
</div>
<div class="dropdown top light center" v-bind:class="{open:opened_dialog=='type-align'}">
<div class="btn-collapse" v-bind:class="{in:selection_metrics.contains_text}">
<button class="btn btn-transparent btn-icon-labeled" v-on:click="open_dialog('type-align')" v-bind:class="{open : opened_dialog=='type-align'}">
<span class="icon icon-text-align-left-alt"></span>
<span class="icon-label">[[__("tool_align")]]</span>
</button>
</div>
<div class="dialog">
{% include "./text-align.html" %}
</div>
</div>
<div class="dropdown top light center" v-bind:class="{open:opened_dialog=='layout'}">
<div class="btn-collapse" v-bind:class="{in:selection_metrics.count>0}">
<button class="btn btn-transparent btn-icon-labeled" v-on:click="open_dialog('layout')" v-bind:class="{open : opened_dialog=='layout'}">
<span class="icon icon-cluster"></span>
<span class="icon-label">[[__("tool_layout")]]</span>
</button>
</div>
<div class="dialog">
{% include "./layout.html" %}
</div>
</div>
<div class="dropdown top light center" v-bind:class="{open:opened_dialog=='text-settings'}">
<div class="btn-collapse in">
<button class="btn btn-transparent btn-icon-labeled" v-on:click="open_dialog('text-settings')" v-bind:class="{open : opened_dialog=='text-settings'}">
<span class="icon icon-text-typeface"></span>
<span class="icon-label">Font</span>
</button>
</div>
<div class="dialog">
{% include "./text-digits.html" %}
</div>
</div>
<button class="btn btn-divider"></button>
<div class="dropdown top light center" v-bind:class="{open:opened_dialog=='object-options'}">
<button class="btn btn-transparent btn-icon-labeled" v-on:click="open_dialog('object-options')" v-bind:class="{open : opened_dialog=='object-options'}">
<span class="icon icon-cogwheel"></span>
<span class="icon-label">[[__("more")]]</span>
</button>
<div class="dialog no-min-w">
{% include "./object-options.html" %}
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,29 @@
<div class="toolbar toolbar-social"
v-bind:class="{in : active_space_role=='viewer' || (present_mode && active_space.access_mode=='public')}"
v-if="social_bar && active_space_loaded">
<div class="btn-group dark">
<div id="share-dialog" class="dropdown bottomleft light center static" v-bind:class="{open:opened_dialog=='share'}">
<button class="btn btn-primary btn-icon-labeled" v-on:click="open_dialog('share')">
<span class="icon icon-share" style="color:white"></span>
<span class="icon-label" style="color:white"> Share </span>
</button>
<div class="dialog">
{% include "./share.html" %}
</div>
</div>
<div id="share-dialog" class="dropdown bottom light center static" v-bind:class="{open:opened_dialog=='embed'}">
<button class="btn btn-transparent btn-icon-labeled" v-on:click="open_dialog('embed')">
<span class="icon icon-embed"></span>
<span class="icon-label"> Embed </span>
</button>
<div class="dialog">
{% include "./embed.html" %}
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,72 @@
<div class="toolbar toolbar-text in" v-cloak v-show="(active_space && (active_view == 'space' && !is_active_space_role('viewer') && editing_artifact_id!=null))">
<div class="btn-group dark">
<div class="dropdown bottomleft light center" v-bind:class="{open:opened_dialog=='text-formats'}">
<div v-bind:class="{in:selection_metrics.contains_text}">
<button class="btn btn-transparent" v-on:click="open_dialog('text-formats')" v-bind:class="open : opened_dialog=='text-formats'">
{{active_text_format_name}}
</button>
</div>
<div class="dialog">
{% include "./text-formats.html" %}
</div>
</div>
<button class="btn btn-divider"></button>
<div class="dropdown bottom light center" v-bind:class="{open:opened_dialog=='text-settings'}">
<button class="btn btn-transparent btn-icon-labeled hover" v-on:click="open_dialog('text-settings')" v-bind:class="{open : opened_dialog=='text-settings'}">
<span class="text-medium">{{active_style.font_family}}</span>
<span class="slash">/</span>
<span class="text-medium">{{active_style.font_size}}px</span>
</button>
<div class="dialog">
{% include "./text-digits.html" %}
</div>
</div>
<button class="btn btn-divider"></button>
<div class="dropdown bottom light center" v-bind:class="{open:opened_dialog=='text-align'}">
<button class="btn btn-transparent btn-icon-labeled hover" v-on:click="open_dialog('text-align')" v-bind:class="{open : opened_dialog=='text-align'}">
<span class="icon icon-text-align-left-alt"></span>
<span class="icon-label">Align</span>
</button>
<div class="dialog">
{% include "./text-align.html" %}
</div>
</div>
<div class="dropdown bottom light center" v-bind:class="{open:opened_dialog=='text-styles'}">
<button class="btn btn-transparent btn-icon-labeled hover" v-on:click="open_dialog('text-styles')" v-bind:class="{open : opened_dialog=='text-styles'}">
<span class="icon icon-text-styles"></span>
<span class="icon-label">styles</span>
</button>
<div class="dialog">
{% include "./text-styles.html" %}
</div>
</div>
</div>
<div class="btn-group dark">
<button class="btn btn-transparent btn-icon-labeled hover" v-on="click : apply_formatting($event,'insertUnorderedList')">
<span class="icon icon-text-list-bullet"></span>
<span class="icon-label">Bullets</span>
</button>
<button class="btn btn-transparent btn-icon-labeled hover" v-on="click : apply_formatting($event,'insertOrderedList')">
<span class="icon icon-text-list-numbered"></span>
<span class="icon-label">Number</span>
</button>
</div>
<div class="btn-group dark">
<button class="btn btn-transparent btn-icon-labeled hover" v-on:click=" toggle_selected_artifact_editing()">
<span class="icon icon-cross-1"></span>
<span class="icon-label">Cancel</span>
</button>
</div>
</div>

View File

@@ -0,0 +1,15 @@
<h4 class="dialog-title">Video</h4>
<div id="video">
<div class="dialog-section">
<label class="btn btn-xxl btn-transparent btn-icon">
<span class="icon icon-video-camera"></span>
<input type="file" accept="video/*" multiple v-on="change:handle_video_file_upload($event)" id="video_file_upload">
</label>
<p>Click to Upload<br/> or drag file(s) anywhere.</p>
</div>
<div class="dialog-section no-p-b">
<input type="text" v-model="video_search_query" class="input input-md input-white input-round text-center no-p no-b no-r input-block" placeholder="Search / Paste URL" v-on="keyup:search_videos(video_search_query) | key enter">
</div>
<button class="btn btn-transparent btn-block text-center" v-on="click:handle_insert_video_url(video_search_query)">Insert Video</button>
</div>

View File

@@ -0,0 +1,17 @@
<h4 class="dialog-title">[[__("tool_zones")]]</h4>
<div id="zones" style="max-height:500px;overflow-y:scroll">
<div class="dialog-section">
<p v-if="zones.length<2">
Turn your Space into a zooming presentation by placing some Zones and switch through them when presenting.
</p>
<button v-on:click="add_zone()" class="btn btn-sm btn-primary">[[__("add_zone")]]</button>
</div>
<div class="dialog-section no-p" v-for="z in zones | orderBy 'style.order'" style="white-space: nowrap;text-align:left;cursor:pointer" v-on:click="zoom_to_zone(z)">
<button class="btn btn-sm btn-transparent">{{{z.description}}}</button>
<button v-if="$index==current_zone_idx" v-on:click="sort_zone_up(z)" class="btn btn-sm btn-round btn-transparent btn-icon"><span class="icon icon-triangle-up"></span></button>
<button v-if="$index==current_zone_idx" v-on:click="sort_zone_down(z)" class="btn btn-sm btn-round btn-transparent btn-icon"><span class="icon icon-triangle-down"></span></button>
</div>
</div>

10
views/public/contact.html Normal file
View File

@@ -0,0 +1,10 @@
{% extends '../layouts/outer.html' %}
{% block title %}[[ __("contact") ]]{% endblock %}
{% block content %}
<div class="landing-box">
</div>
{% endblock %}

View File

@@ -0,0 +1,9 @@
{% extends '../layouts/outer.html' %}
{% block title %}[[ __("privacy") ]]{% endblock %}
{% block content %}
<div class="landing-box">
</div>
{% endblock %}

8
views/public/terms.html Normal file
View File

@@ -0,0 +1,8 @@
{% extends '../layouts/outer.html' %}
{% block title %}[[ __("terms") ]]{% endblock %}
{% block content %}
<div class="landing-box">
</div>
{% endblock %}

20
views/space_list.html Normal file
View File

@@ -0,0 +1,20 @@
<html>
<body>
<h2>[[ __("folder") ]]: [[space.name]]</h2>
<table class="table table-striped" >
<tr>
<th>[[__("created")]]</th>
<th>[[__("name")]]</th>
<th>[[__("link")]]</th>
</tr>
{% for s in subspaces %}
<tr>
<td>[[ s.created_at | date('d.m.Y H:i') ]]</td>
<td>[[ s.name ]]</td>
<td>[[ s.ae_link ]]</td>
</tr>
{% endfor %}
</table>
</body>
</html>

110
views/spacedeck.html Normal file
View File

@@ -0,0 +1,110 @@
<!doctype html>
<html class="no-js">
<head>
<meta charset="utf-8">
<title>Spacedeck Open</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<link href="[[ '/images/favicon.png' | cdn ]]" rel="icon" type="image/x-icon" />
<link href='https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,700,600,800,300|Montserrat:400,700|EB+Garamond|Vollkorn|Lato|Roboto|Source+Code+Pro|Ubuntu|Raleway|Playfair+Display|Crimson+Text' rel='stylesheet' type='text/css'>
<link type="text/css" rel="stylesheet" href="https://fast.fonts.net/cssapi/ee1a3484-4d98-4f9f-9f55-020a7b37f3c5.css"/>
<link rel="stylesheet" href="[[ '/stylesheets/style.css' | cdn ]]">
<script src="//cdnjs.cloudflare.com/ajax/libs/twemoji/1.3.2/twemoji.min.js"></script>
<script>
window.socket_auth = '[[socket_auth]]';
window.browser_lang = '[[locale]]';
window.csrf_token = '[[csrf_token]]';
{% if process.env.NODE_ENV != "production" %}
var ENV = {
name: 'development',
webHost: "localhost:9000",
webEndpoint:"http://localhost:9000",
apiEndpoint: "http://localhost:9000",
websocketsEndpoint: "ws://localhost:9000"
};
{% endif %}
{% if subdomain_team %}
var subdomainTeam = [[ subdomain_team | json | safe ]];
{% else %}
var subdomainTeam = null;
{% endif %}
</script>
{% if process.env.NODE_ENV == "production" %}
<script src="[[ '/javascripts/spacedeck.js' | cdn ]]"></script>
{% else %}
<script minify src="/javascripts/jquery-2.1.4.min.js"></script>
<script minify src="/javascripts/i18next-1.11.2.js"></script>
<script minify src="/javascripts/clipboard.js"></script>
<script minify src="/javascripts/lodash.compat.js"></script>
<script minify src="/javascripts/fastclick.js"></script>
<script minify src="/javascripts/vue.js"></script>
<script minify src="/javascripts/moment.js"></script>
<script minify src="/javascripts/medium.patched.js"></script>
<script minify src="/javascripts/route-recognizer.js"></script>
<script minify src="/javascripts/backend.js"></script>
<script minify src="/javascripts/link_parser.js"></script>
<script minify src="/javascripts/vector-render.js"></script>
<script minify src="/javascripts/mousetrap.js"></script>
<script minify src="/javascripts/smoke.js"></script>
<script minify src="/javascripts/helper.js"></script>
<script minify src="/javascripts/packer.growing.js"></script>
<script minify src="/javascripts/spacedeck_routes.js"></script>
<script minify src="/javascripts/spacedeck_formatting.js"></script>
<script minify src="/javascripts/spacedeck_sections.js"></script>
<script minify src="/javascripts/spacedeck_spaces.js"></script>
<script minify src="/javascripts/spacedeck_teams.js"></script>
<script minify src="/javascripts/spacedeck_board_artifacts.js"></script>
<script minify src="/javascripts/spacedeck_users.js"></script>
<script minify src="/javascripts/spacedeck_account.js"></script>
<script minify src="/javascripts/spacedeck_modals.js"></script>
<script minify src="/javascripts/spacedeck_avatars.js"></script>
<script minify src="/javascripts/spacedeck_websockets.js"></script>
<script minify src="/javascripts/spacedeck_whiteboard.js"></script>
<script minify src="/javascripts/spacedeck_directives.js"></script>
<script minify src="/javascripts/spacedeck_vue.js"></script>
{% endif %}
</head>
<body id="main" v-bind:class="{'present-mode':present_mode,'modal-open':active_modal}" v-on:click="handle_body_click($event)">
<!--[if lt IE 10]>
<p class="browsehappy">You are using an <strong>outdated</strong> version of Internet Explorer. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
<![endif]-->
{% include "./partials/login.html" %}
{% include "./partials/space.html" %}
{% include "./partials/folders.html" %}
{% include "./partials/team.html" %}
{% include "./partials/account.html" %}
{% include "./partials/meta.html" %}
{% include "./partials/meta-folder.html" %}
{% include "./partials/modal/access.html" %}
{% include "./partials/modal/folder-settings.html" %}
{% include "./partials/modal/support.html" %}
{% include "./partials/modal/login.html" %}
{% include "./partials/modal/pdfoptions.html" %}
</body>
<script type="text/javascript">
window.locales = {};
window.locales.en = {};
window.locales.de = {};
window.locales.fr = {};
window.locales.en.translation = {% include "./../locales/en.js" %};
window.locales.de.translation = {% include "./../locales/de.js" %};
window.locales.fr.translation = {% include "./../locales/fr.js" %};
</script>
</html>