Add jquery layout library and support for resizable panels
72
css/main.css
@ -3,16 +3,20 @@ body {
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
#file-title {
|
||||
#navbar {
|
||||
position: static;
|
||||
}
|
||||
|
||||
#file-title-input {
|
||||
display: none;
|
||||
#menu-bar {
|
||||
margin-right: 20px;
|
||||
}
|
||||
|
||||
#wmd-button-bar {
|
||||
margin-left: 20px;
|
||||
}
|
||||
|
||||
#wmd-input, #wmd-preview {
|
||||
position: absolute;
|
||||
top: 50px;
|
||||
}
|
||||
|
||||
#wmd-input {
|
||||
@ -27,27 +31,15 @@ body {
|
||||
}
|
||||
|
||||
.wmd-button-row {
|
||||
margin: 10px;
|
||||
margin: 10px 0;
|
||||
height: 20px;
|
||||
}
|
||||
|
||||
.wmd-spacer {
|
||||
margin: 0 7px;
|
||||
margin: 0 5px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
/*
|
||||
.wmd-button {
|
||||
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
padding-left: 2px;
|
||||
padding-right: 3px;
|
||||
display: inline-block;
|
||||
list-style: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
*/
|
||||
.wmd-button>span {
|
||||
background-image: url(../img/wmd-buttons.png);
|
||||
background-repeat: no-repeat;
|
||||
@ -100,3 +92,47 @@ body {
|
||||
background-position: -456px -168px;
|
||||
}
|
||||
|
||||
.ui-layout-toggler-north {
|
||||
margin-top: -3px !important;
|
||||
height: 18px !important;
|
||||
}
|
||||
|
||||
.ui-layout-toggler-north-open .caret,
|
||||
.ui-layout-toggler-south-closed .caret {
|
||||
border-bottom: 5px solid #525252;
|
||||
border-right: 5px solid transparent;
|
||||
border-left: 5px solid transparent;
|
||||
border-top: 0;
|
||||
}
|
||||
|
||||
.ui-layout-toggler-north-closed .caret,
|
||||
.ui-layout-toggler-south-open .caret {
|
||||
border-top: 5px solid #525252;
|
||||
border-right: 5px solid transparent;
|
||||
border-left: 5px solid transparent;
|
||||
border-bottom: 0;
|
||||
}
|
||||
|
||||
|
||||
.ui-layout-toggler-east {
|
||||
margin-left: 3px !important;
|
||||
width: 18px !important;
|
||||
}
|
||||
|
||||
.ui-layout-toggler-east-open .caret,
|
||||
.ui-layout-toggler-west-closed .caret {
|
||||
border-bottom: 5px solid transparent;
|
||||
border-top: 5px solid transparent;
|
||||
border-left: 5px solid #525252;
|
||||
border-right: 0;
|
||||
margin-top: 40px;
|
||||
}
|
||||
|
||||
.ui-layout-toggler-east-closed .caret,
|
||||
.ui-layout-toggler-west-opened .caret {
|
||||
border-bottom: 5px solid transparent;
|
||||
border-top: 5px solid transparent;
|
||||
border-right: 5px solid #525252;
|
||||
border-left: 0;
|
||||
margin-top: 40px;
|
||||
}
|
||||
|
Before Width: | Height: | Size: 630 B After Width: | Height: | Size: 645 B |
Before Width: | Height: | Size: 270 B After Width: | Height: | Size: 278 B |
Before Width: | Height: | Size: 314 B After Width: | Height: | Size: 321 B |
BIN
img/stackedit-64.ico
Normal file
After Width: | Height: | Size: 2.6 KiB |
Before Width: | Height: | Size: 446 B After Width: | Height: | Size: 450 B |
73
index.html
@ -1,12 +1,17 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Pagedown editor</title>
|
||||
<title>StackEdit</title>
|
||||
<link rel="icon" href="img/stackedit-64.ico" type="image/x-icon">
|
||||
<link rel="shortcut icon" href="img/stackedit-64.ico"
|
||||
type="image/x-icon">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<!-- Bootstrap -->
|
||||
<link href="css/bootstrap.css" rel="stylesheet" media="screen">
|
||||
<link href="css/main.css" rel="stylesheet" media="screen">
|
||||
<script type="text/javascript" src="js/jquery.js"></script>
|
||||
<script type="text/javascript" src="js/jquery-ui.custom.js"></script>
|
||||
<script type="text/javascript" src="js/jquery.layout.js"></script>
|
||||
<script type="text/javascript" src="js/bootstrap.js"></script>
|
||||
<script type="text/javascript" src="js/Markdown.Converter.js"></script>
|
||||
<script type="text/javascript" src="js/Markdown.Sanitizer.js"></script>
|
||||
@ -37,39 +42,65 @@
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="navbar" class="navbar navbar-fixed-top">
|
||||
<div id="navbar" class="navbar navbar-fixed-top ui-layout-north">
|
||||
<div class="navbar-inner">
|
||||
|
||||
<ul class="nav">
|
||||
<li class="divider-vertical"></li>
|
||||
<li><div id="wmd-button-bar"></div></li>
|
||||
</ul>
|
||||
<ul class="nav pull-right">
|
||||
<li><a class="brand" id="file-title" href="javascript:void(0);" title="Rename"><span></span></a></li>
|
||||
<li class="navbar-form"><input id="file-title-input"
|
||||
type="text" class="span3" placeholder="File title" /></li>
|
||||
<li class="dropdown"><a class="dropdown-toggle"
|
||||
data-toggle="dropdown" href="#" title="Open file"><i
|
||||
class="icon-folder-open"></i></a>
|
||||
<ul class="pull-right" id="menu-bar">
|
||||
<li class="btn-group"><a class="btn action-create-file"
|
||||
href="javascript:void(0);" title="Create a local file"><i
|
||||
class="icon-file"></i></a> <a class="btn" href="javascript:void(0);"
|
||||
title="Delete the current file locally" data-toggle="modal"
|
||||
data-target="#remove-file-confirm"><i class="icon-trash"></i></a> <a
|
||||
class="btn dropdown-toggle" data-toggle="dropdown" href="#"
|
||||
title="Open a local file"><i class="icon-folder-open"></i></a>
|
||||
<ul id="file-selector" class="dropdown-menu">
|
||||
</ul></li>
|
||||
<li class="divider-vertical"></li>
|
||||
<li class="dropdown"><a class="dropdown-toggle"
|
||||
data-toggle="dropdown" href="#" title="Menu"><img src="img/stackedit-16.png" />
|
||||
Menu <b class="caret"></b></a>
|
||||
<li class="btn-group"><a class="btn dropdown-toggle"
|
||||
data-toggle="dropdown" href="javascript:void(0);" title="Menu"><img
|
||||
src="img/stackedit-16.png" /> <b class="caret"></b></a>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a id="new-file" href="javascript:void(0);" title="Create a new local file"><i
|
||||
class="icon-file"></i> New file</a></li>
|
||||
<li><a id="remove-file" href="javascript:void(0);" title="Delete the current file locally"><i
|
||||
class="icon-trash"></i> Remove file</a></li>
|
||||
<li><a class="action-create-file" href="javascript:void(0);"
|
||||
title="Create a new local file"><i class="icon-file"></i> New
|
||||
file</a></li>
|
||||
<li><a href="javascript:void(0);"
|
||||
title="Delete the current file locally" data-toggle="modal"
|
||||
data-target="#remove-file-confirm"><i class="icon-trash"></i>
|
||||
Remove file</a></li>
|
||||
<li><a id="drive-link" href="javascript:void(0);"><i
|
||||
class="icon-magnet"></i> Link with Google Drive</a></li>
|
||||
</ul></li>
|
||||
<li class="divider-vertical"></li>
|
||||
</ul>
|
||||
<ul class="nav pull-right">
|
||||
<li><a class="brand" id="file-title" href="javascript:void(0);"
|
||||
title="Rename the current file"><span class="file-title"></span></a></li>
|
||||
<li class="navbar-form"><input id="file-title-input"
|
||||
type="text" class="span3 hide" placeholder="File title" /></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<textarea id="wmd-input"></textarea>
|
||||
<div id="wmd-preview" class="well"></div>
|
||||
<textarea id="wmd-input" class="ui-layout-center"></textarea>
|
||||
<div id="wmd-preview" class="well ui-layout-east"></div>
|
||||
<div class="ui-layout-south"></div>
|
||||
<div id="remove-file-confirm" class="modal hide">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal"
|
||||
aria-hidden="true">×</button>
|
||||
<h3>Remove file</h3>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<p>Are you sure you want to remove "<span class="file-title"></span>"?
|
||||
</p>
|
||||
<p class="muted"><b>NOTE:</b> The file will be destroyed on the
|
||||
local machine, not on distant synchronized locations.</p>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<a href="javascript:void(0);" class="btn" data-dismiss="modal">Cancel</a>
|
||||
<a href="javascript:void(0);"
|
||||
class="btn btn-primary action-remove-file" data-dismiss="modal">Delete</a>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
3670
js/jquery-ui.custom.js
vendored
Normal file
5939
js/jquery.layout.js
Normal file
139
js/main.js
@ -11,11 +11,15 @@ var fileManager = (function($) {
|
||||
window.setInterval(function() {
|
||||
fileManager.saveFile();
|
||||
}, 5000);
|
||||
$("#new-file").click(function() {
|
||||
$(".action-create-file").click(function() {
|
||||
fileManager.saveFile();
|
||||
fileManager.createFile();
|
||||
fileManager.selectFile();
|
||||
});
|
||||
$(".action-remove-file").click(function() {
|
||||
fileManager.deleteFile();
|
||||
fileManager.selectFile();
|
||||
});
|
||||
$("#file-title").click(function() {
|
||||
$(this).hide();
|
||||
$("#file-title-input").show().focus();
|
||||
@ -28,7 +32,7 @@ var fileManager = (function($) {
|
||||
}
|
||||
$(this).hide();
|
||||
$("#file-title").show();
|
||||
fileManager.updateFileTitleList();
|
||||
fileManager.updateFileDescList();
|
||||
fileManager.updateFileTitleUI();
|
||||
});
|
||||
};
|
||||
@ -39,22 +43,15 @@ var fileManager = (function($) {
|
||||
localStorage.clear();
|
||||
localStorage["file.count"] = 0;
|
||||
}
|
||||
this.updateFileTitleList();
|
||||
this.updateFileDescList();
|
||||
// If no file create one
|
||||
if(this.fileTitleList.length === 0) {
|
||||
if(this.fileDescList.length === 0) {
|
||||
this.createFile();
|
||||
this.updateFileTitleList();
|
||||
this.updateFileDescList();
|
||||
}
|
||||
// If no default file take first one
|
||||
if(!localStorage["file.current"]) {
|
||||
var fileCount = parseInt(localStorage["file.count"]);
|
||||
for(var i=0; i<fileCount; i++) {
|
||||
var fileIndex = "file." + i;
|
||||
if(localStorage[fileIndex + ".title"]) {
|
||||
localStorage["file.current"] = fileIndex;
|
||||
break;
|
||||
}
|
||||
}
|
||||
localStorage["file.current"] = this.fileDescList[0].index;
|
||||
}
|
||||
// Update the editor and the file title
|
||||
var fileIndex = localStorage["file.current"];
|
||||
@ -67,53 +64,80 @@ var fileManager = (function($) {
|
||||
if(!title) {
|
||||
title = "Filename";
|
||||
}
|
||||
var fileIndex = "file." + parseInt(localStorage["file.count"]);
|
||||
localStorage[fileIndex + ".title"] = title;
|
||||
// Find a fileIndex
|
||||
var fileCount = parseInt(localStorage["file.count"]);
|
||||
var i;
|
||||
for(i=0; i<fileCount; i++) {
|
||||
if(!localStorage["file." + i + ".title"]) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
var fileIndex = "file." + i;
|
||||
// Create the file in the localStorag
|
||||
localStorage[fileIndex + ".content"] = "";
|
||||
localStorage["file.count"] = parseInt(localStorage["file.count"]) + 1;
|
||||
localStorage[fileIndex + ".title"] = title;
|
||||
localStorage["file.current"] = fileIndex;
|
||||
if(i == fileCount) {
|
||||
localStorage["file.count"] = fileCount + 1;
|
||||
}
|
||||
};
|
||||
|
||||
fileManager.updateFileTitleList = function() {
|
||||
fileManager.deleteFile = function() {
|
||||
var fileIndex = localStorage["file.current"];
|
||||
localStorage.removeItem("file.current");
|
||||
localStorage.removeItem(fileIndex + ".title");
|
||||
localStorage.removeItem(fileIndex + ".content");
|
||||
};
|
||||
|
||||
fileManager.updateFileDescList = function() {
|
||||
var fileCount = parseInt(localStorage["file.count"]);
|
||||
this.fileTitleList = [];
|
||||
var lastIndex = -1;
|
||||
this.fileDescList = [];
|
||||
$("#file-selector").empty();
|
||||
for(var i=0; i<fileCount; i++) {
|
||||
var fileIndex = "file." + i;
|
||||
var title = localStorage[fileIndex + ".title"];
|
||||
if(title) {
|
||||
this.fileTitleList[i] = title;
|
||||
lastIndex = i;
|
||||
this.fileDescList.push({"index": fileIndex, "title": title});
|
||||
}
|
||||
}
|
||||
localStorage["file.count"] = lastIndex + 1;
|
||||
this.fileDescList.sort(function(a, b) {
|
||||
if (a.title.toLowerCase() < b.title.toLowerCase())
|
||||
return -1;
|
||||
if (a.title.toLowerCase() > b.title.toLowerCase())
|
||||
return 1;
|
||||
return 0;
|
||||
});
|
||||
};
|
||||
|
||||
fileManager.updateFileTitleUI = function() {
|
||||
// Update the editor and the file title
|
||||
var fileIndex = localStorage["file.current"];
|
||||
var title = localStorage[fileIndex + ".title"];
|
||||
$("#file-title > span").text(title);
|
||||
document.title = "StackEdit - " + title;
|
||||
$(".file-title").text(title);
|
||||
$("#file-title-input").val(title);
|
||||
$("#file-selector").empty();
|
||||
for(var i=0; i<this.fileTitleList.length; i++) {
|
||||
title = this.fileTitleList[i];
|
||||
if(title) {
|
||||
var fileIndex1 = "file." + i;
|
||||
var a = $("<a>").text(title);
|
||||
var li = $("<li>").append(a);
|
||||
if(fileIndex1 == fileIndex) {
|
||||
li.addClass("disabled");
|
||||
}
|
||||
else {
|
||||
a.attr("href", "javascript:void(0);")
|
||||
.click((function(fileIndex) {
|
||||
return function() {
|
||||
localStorage["file.current"] = fileIndex;
|
||||
fileManager.selectFile();
|
||||
};
|
||||
})(fileIndex1));
|
||||
}
|
||||
$("#file-selector").append(li);
|
||||
|
||||
for(var i=0; i<this.fileDescList.length; i++) {
|
||||
var fileDesc = this.fileDescList[i];
|
||||
var a = $("<a>").text(fileDesc.title);
|
||||
var li = $("<li>").append(a);
|
||||
if(fileDesc.index == fileIndex) {
|
||||
li.addClass("disabled");
|
||||
}
|
||||
else {
|
||||
a.attr("href", "javascript:void(0);")
|
||||
.click((function(fileIndex) {
|
||||
return function() {
|
||||
localStorage["file.current"] = fileIndex;
|
||||
fileManager.selectFile();
|
||||
};
|
||||
})(fileDesc.index));
|
||||
}
|
||||
$("#file-selector").append(li);
|
||||
}
|
||||
};
|
||||
|
||||
@ -202,7 +226,7 @@ function createEditor() {
|
||||
var editor = new Markdown.Editor(converter);
|
||||
editor.run();
|
||||
|
||||
$(".wmd-button-row").addClass("btn-group").find("li:not(.wmd-spacer)").addClass("btn").css({"left": 0,}).find("span").hide();
|
||||
$(".wmd-button-row").addClass("btn-group").find("li:not(.wmd-spacer)").addClass("btn").css("left", 0).find("span").hide();
|
||||
$("#wmd-bold-button").append($("<i>").addClass("icon-bold"));
|
||||
$("#wmd-italic-button").append($("<i>").addClass("icon-italic"));
|
||||
$("#wmd-link-button").append($("<i>").addClass("icon-globe"));
|
||||
@ -215,28 +239,39 @@ function createEditor() {
|
||||
$("#wmd-hr-button").append($("<i>").addClass("icon-hr"));
|
||||
$("#wmd-undo-button").append($("<i>").addClass("icon-undo"));
|
||||
$("#wmd-redo-button").append($("<i>").addClass("icon-share-alt"));
|
||||
|
||||
}
|
||||
|
||||
var layoutOrientation = 0;
|
||||
var layout;
|
||||
function createLayout() {
|
||||
var layoutGlobalConfig = { closable : true, resizable : false,
|
||||
slidable : false, livePaneResizing : true, spacing_open : 20,
|
||||
spacing_closed : 20, togglerLength_open : 90,
|
||||
togglerLength_closed : 90, center__minWidth : 200,
|
||||
stateManagement__enabled : false, };
|
||||
if (layoutOrientation === 0) {
|
||||
layout = $('body').layout(
|
||||
$.extend(layoutGlobalConfig,
|
||||
{ east__resizable : true, east__size : .5, east__minSize : 200,
|
||||
south__closable : false, }));
|
||||
}
|
||||
$(".ui-layout-toggler-north").addClass("btn").append($("<b>").addClass("caret"));
|
||||
$(".ui-layout-toggler-east").addClass("btn").append($("<b>").addClass("caret"));
|
||||
}
|
||||
|
||||
(function($) {
|
||||
|
||||
$(function() {
|
||||
|
||||
$(window).resize(resize);
|
||||
resize();
|
||||
|
||||
createLayout();
|
||||
if (typeof (Storage) !== "undefined") {
|
||||
fileManager.init();
|
||||
} else {
|
||||
showError("Web storage is not available");
|
||||
};
|
||||
}
|
||||
$("#navbar").click(function() {
|
||||
layout.allowOverflow('north');
|
||||
});
|
||||
});
|
||||
|
||||
function resize() {
|
||||
$("#wmd-input").width($(window).width() / 2 - 60).height(
|
||||
$(window).height() - 70);
|
||||
$("#wmd-preview").width($(window).width() / 2 - 60).height(
|
||||
$(window).height() - 100);
|
||||
};
|
||||
|
||||
})(jQuery);
|
||||
|